首页 文章

从 Java 内部无声打印 PDF

提问于
浏览 30198 次
13

我们正在研究 Java 内部的 PDF 文档的静默打印。打印将从桌面调用,而不是通过浏览器调用,因此我们无法使用 JavaScript。 PDF Renderer 是一种可操作的解决方案,但它们的渲染质量是不可接受的。 iText 似乎不能与 Java 打印服务一起插件。有一些商业 Java 库,Qoppa 的 jPDFPrint,JPedal 和 ICEpdf,我们还没有尝试过。

有没有人有从 Java 静态打印的经验?

7 回答

  • 11

    Apache PDFBox。它目前处于孵化阶段,但 PDF 打印功能在此之前就已存在。在内部,它使用 Java Print Services 来创建打印作业,它还支持无声印刷

    请注意它也需要 Fontbox,并且当前(即将发布的 0.8.0 版本)包含具有 Type 0 字体的文档的优雅后备。 1 号字体打印正确;但是在 0.7.3 中,尝试使用 Type 0 字体打印文档将导致抛出异常。

  • 2

    也许我误解了,但为什么不直接使用 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.");
    }
    
  • 2

    这对我有用:

    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.");
        }       
    }
    
  • 0

    看看 www.pdflib.com。它的商业性但 PDFlib Lite 可免费用于开源项目。它有 java 的绑定。

  • 0

    http://www.jpedal.org/support_egSP.php有一个使用 JPedal 的例子

    如果您需要全字体支持,则需要商业版的 IcePdf。

  • 0

    我有使 Acrobat(Reader 或 Full)进行打印的经验,但它只是静音(它无人看管,但只取决于静音要求的'无声')。如果有兴趣,我可以向您发送进行所需 DDE 调用的本机代码。

  • 0

    iText 用于创建 PDF 文件(根据我从作者那里看到的帖子),因此可能不是您想要的。

    为了这个目的,我已经非常成功地使用了 Qoppa 的 jPDFPrint,但它并不便宜。如果你能负担得起,它是迄今为止我发现的最强大的解决方案。我对支持程度也印象深刻;他们甚至为我生成了一些自定义示例代码。

    我试过 PDFBox,但发现它不支持 Acrobat 的“缩小到可打印区域”页面缩放。不是每个人都会关心这个功能,但这对我来说至关重要。

相关问题