从Java打印多个PDF作为单个打印作业(物理打印)

时间:2009-04-21 20:07:53

标签: java pdf printing

我想在一个打印作业中从java(使用java打印服务)打印多个pdf。

我想将多个pdf作为单个作业发送到打印机。这样我的“批处理”中的所有文档一起打印,并且当我从打印机中取出时,它们不会与其他人的打印作业交错。

批次可能包含1000个打印作业。

我尝试了jpedal,但它不支持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();

仅打印出第一个pdf。如何在一个作业中打印多个pdf?

readFileAndApplyOptions()基本上创建一个新的PdfDecoder对象并返回它。

我也以类似的方式尝试了Sun的PDFRenderer PDFRenderer(使用Book对象),但我的代码仍然只打印出第一页。

之前有没有遇到过类似的问题?有没有我可能缺少的解决方案?

4 个答案:

答案 0 :(得分:2)

不是特定于Java的,但我在C#中遇到过这个问题。我通过将每个文档打印到一个文件(在编程上等同于打印对话框上的“PrintToFile”复选框)解决了它,然后将每个文件连接成一个内存流,我以原始格式传递给Win32 API打印机假脱机(因为默认情况下,输出到文件已正确格式化。

您可以在Java中使用类似的技术

答案 1 :(得分:2)

我在JTabbedPane的几个JPanel上打印时遇到了同样的困难,每个JPanel都在一个单独的页面上。我把它们收集在一本书中,但它只打印了第一页。

Book类运行良好(正确的页数),但我认为问题来自setPageable。由于一本书不是可印刷的,我做了它,它起作用了!

解决方法:

  1. 设计PrintableBook类:extends Book,实现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. 然后使用printJob.setPrintable( printableBook )代替setPageable

答案 2 :(得分:1)

您应该使用iText库将所有pdf文档合并到一个文档中,然后逐页打印合并的文档。

请参阅Print a PDF Document in Java

答案 3 :(得分:0)

AFAIK,你不能,多个文件将被打印在多个工作岗位上。

解决方法是将所有pdf加入单个文档并打印出来。

: - /