【问题标题】:Printing Multiple PDFs from Java as a single print job (physical printing)从 Java 打印多个 PDF 作为单个打印作业(物理打印)
【发布时间】:2010-10-20 22:27:29
【问题描述】:

我想在一个打印作业中从 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 对象并返回它。

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

有没有人遇到过类似的问题?有没有我可能遗漏的解决方案?

【问题讨论】:

    标签: java pdf printing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      Book 类运行良好(页数正确),但我认为问题出在 setPageable。因为一本书不是可打印的,所以我制作了它,并且它有效!

      解决方法:

      1. 设计一个 PrintableBook 类:扩展 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

      【讨论】:

      • 不错的解决方法!但是,我不认为,问题在于setPageable() 方法。此外,您不必为页面使用单独的 Vector,因为 Book 在内部这样做。因此,使用getNumberOfPages() 代替pages.size()getPrintable(pageIndex) 代替pages.elementAt(pageIndex) 调用。
      【解决方案3】:

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

      Print a PDF Document in Java

      【讨论】:

        【解决方案4】:

        AFAIK,您不能,多个文档将在多个作业中打印。

        一种解决方法是将所有 pdf 合并到一个文档中并打印它们。

        :-/

        【讨论】:

          猜你喜欢
          • 2012-10-02
          • 2016-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多