从Java内部无声打印PDF

时间:2009-09-10 20:13:12

标签: java pdf printing pdf-generation

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

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

7 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分: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 :(得分: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.");
    }       
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

http://www.jpedal.org/support_egSP.php

使用JPedal有一个例子

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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