3
votes

I would like to print multiple pdfs from java (using the java print service) in a single print job.

I would like to send multiple pdfs as a single job to the printer. This is so that all the documents in my 'batch' print together and are not interleaved with someone else's print jobs when I go pick them up from the printer.

A batch potentially consists of 1000s of print jobs.

I tried jpedal, but it does not support java.awt.print.Book

        Book book = new Book();
        PdfDecoder pdfDecoder = readFileApplyOptions("C:/Temp/singlepagetest.pdf", pageFormat);
        book.append(pdfDecoder, pageFormat);

        PdfDecoder pdfDecoderTwo = readFileApplyOptions("C:/Temp/printfax-test.pdf",pageFormat);
        book.append(pdfDecoderTwo, pageFormat);

        printJob.setPageable(book);
        printJob.print();

only prints out the first pdf. How do I print multiple pdfs in a single job?

readFileAndApplyOptions() basically creates a new PdfDecoder object and returns it.

I also tried Sun's PDFRenderer PDFRenderer in a similar fashion (using the Book object), but my code still only prints out the first page only.

Has anyone encountered a similar issue before? Is there a solution I might be missing?

4

4 Answers

2
votes

Not Java specific, but I've experience of this one in C#. I solved it by printing each document to a file (programmatically equivalent to checking the "PrintToFile" checkbox on a print dialog), then concatenated each file into a memory stream, which I passed to the Win32 API printer spool in raw format (since the output to file was already correctly formatted by default).

You might be able to use a similar technique in Java

2
votes

I met the same difficulties when printing at once several JPanels of a JTabbedPane, each on a separate page. I gather them in a Book but it only prints the first page.

The Book class works well (right number of pages), but I suppose the problem comes from setPageable. Since a Book is not a Printable, I made it, and it works !

Workaround:

  1. Design a PrintableBook class : extends Book, implements Printable

    public class PrintableBook extends Book implements Printable {
        Vector<Printable> pages;// NB: we assume pages are single
    
        public PrintableBook() {
            super();
            pages = new Vector<Printable>();
        }
    
        public void add(Printable pp) {
            append(pp, pp.getPageFormat());
            pages.add(pp);
        }
    
        public int print(Graphics g, PageFormat pf, int pageIndex) {
            if (pageIndex >= pages.size())
                return NO_SUCH_PAGE;
            else {
                Printable pp = pages.elementAt(pageIndex);
                return pp.print(g, pf, 0);
            }
        }
    }
    
  2. Then use printJob.setPrintable( printableBook ) instead of setPageable

1
votes

You should merge all of your pdf documents in one document using iText library and then print the merged document page by page.

see Print a PDF Document in Java

0
votes

AFAIK, you can't, multiple documents will be printed in multiple jobs.

A workaround could be join all the pdf into a single document and print them.

:-/