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

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

问题描述:

我想在单个打印作业中从java(使用java打印服务)打印多个pdf。从单个打印作业打印多个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,但是我的代码仍然只打印出第一页。

有没有人遇到过类似的问题?有没有可能会失踪的解决方案?

AFAIK,你不能,多个文件将被打印在多个作业。

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

: -/

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

您可能能够使用iText库中的一个文档中使用类似的技术在Java中

你应该合并所有的PDF文档中,然后逐页打印合并文档页面。

看到Print a PDF Document in Java

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

Book类效果不错(正确的页数),但我想问题来自setPageable。由于一本书不是可打印的,我做了它,它工作!

解决方法:

  1. 设计一个PrintableBook类:扩展书,实现了打印

    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

+1

好的解决方法!但是,我不认为,问题在于`setPageable()`方法。此外,您不必为页面使用单独的“Vector”,因为“Book”在内部执行此操作。因此,使用getNumberOfPages()而不是`pages.size()`和`getPrintable(pageIndex)`而不是`pages.elementAt(pageIndex)`调用。 – Akshat 2015-03-20 05:50:36