我们正在研究 Java 内部的 PDF 文档的静默打印。打印将从桌面调用,而不是通过浏览器调用,因此我们无法使用 JavaScript。 PDF Renderer 是一种可操作的解决方案,但它们的渲染质量是不可接受的。 iText 似乎不能与 Java 打印服务一起插件。有一些商业 Java 库,Qoppa 的 jPDFPrint,JPedal 和 ICEpdf,我们还没有尝试过。
有没有人有从 Java 静态打印的经验?
Apache PDFBox。它目前处于孵化阶段,但 PDF 打印功能在此之前就已存在。在内部,它使用 Java Print Services 来创建打印作业,它还支持无声印刷。
请注意它也需要 Fontbox,并且当前(即将发布的 0.8.0 版本)包含具有 Type 0 字体的文档的优雅后备。 1 号字体打印正确;但是在 0.7.3 中,尝试使用 Type 0 字体打印文档将导致抛出异常。
也许我误解了,但为什么不直接使用 Print Service API 呢?以下适用于我(假设您将 PDF 文档作为字节数组):
DocFlavor flavor = DocFlavor.BYTE_ARRAY.PDF; PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null); if (services.length > 0) { DocPrintJob printJob = services[0].createPrintJob(); Doc document = new SimpleDoc(pdfBytes, flavor, null) printJob.print(document, null); } else { System.out.println("No PDF printer available."); }
这对我有用:
public void print() { DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null); FileInputStream psStream = null; try { psStream = new FileInputStream("c:\\test.pdf"); } catch (FileNotFoundException ffne) { ffne.printStackTrace(); } if (psStream == null) { return; } if (services.length > 0) { PrintService myService = null; for(PrintService service : services) { System.out.println(service.getName()); if(service.getName().contains("my printer")) { myService = service; break; } } DocPrintJob printJob = myService.createPrintJob(); Doc document = new SimpleDoc(psStream, flavor, null); try { printJob.print(document, null); } catch (PrintException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println("No PDF printer available."); } }
看看 www.pdflib.com。它的商业性但 PDFlib Lite 可免费用于开源项目。它有 java 的绑定。
在http://www.jpedal.org/support_egSP.php有一个使用 JPedal 的例子
如果您需要全字体支持,则需要商业版的 IcePdf。
我有使 Acrobat(Reader 或 Full)进行打印的经验,但它只是静音(它无人看管,但只取决于静音要求的'无声')。如果有兴趣,我可以向您发送进行所需 DDE 调用的本机代码。
iText 用于创建 PDF 文件(根据我从作者那里看到的帖子),因此可能不是您想要的。
为了这个目的,我已经非常成功地使用了 Qoppa 的 jPDFPrint,但它并不便宜。如果你能负担得起,它是迄今为止我发现的最强大的解决方案。我对支持程度也印象深刻;他们甚至为我生成了一些自定义示例代码。
我试过 PDFBox,但发现它不支持 Acrobat 的“缩小到可打印区域”页面缩放。不是每个人都会关心这个功能,但这对我来说至关重要。
7 回答
Apache PDFBox。它目前处于孵化阶段,但 PDF 打印功能在此之前就已存在。在内部,它使用 Java Print Services 来创建打印作业,它还支持无声印刷。
请注意它也需要 Fontbox,并且当前(即将发布的 0.8.0 版本)包含具有 Type 0 字体的文档的优雅后备。 1 号字体打印正确;但是在 0.7.3 中,尝试使用 Type 0 字体打印文档将导致抛出异常。
也许我误解了,但为什么不直接使用 Print Service API 呢?以下适用于我(假设您将 PDF 文档作为字节数组):
这对我有用:
看看 www.pdflib.com。它的商业性但 PDFlib Lite 可免费用于开源项目。它有 java 的绑定。
在http://www.jpedal.org/support_egSP.php有一个使用 JPedal 的例子
如果您需要全字体支持,则需要商业版的 IcePdf。
我有使 Acrobat(Reader 或 Full)进行打印的经验,但它只是静音(它无人看管,但只取决于静音要求的'无声')。如果有兴趣,我可以向您发送进行所需 DDE 调用的本机代码。
iText 用于创建 PDF 文件(根据我从作者那里看到的帖子),因此可能不是您想要的。
为了这个目的,我已经非常成功地使用了 Qoppa 的 jPDFPrint,但它并不便宜。如果你能负担得起,它是迄今为止我发现的最强大的解决方案。我对支持程度也印象深刻;他们甚至为我生成了一些自定义示例代码。
我试过 PDFBox,但发现它不支持 Acrobat 的“缩小到可打印区域”页面缩放。不是每个人都会关心这个功能,但这对我来说至关重要。