【问题标题】:PDFBox Freezes at Print() CommandPDFBox 在 Print() 命令处冻结
【发布时间】:2015-10-10 09:09:07
【问题描述】:

我正在尝试使用 PDFBox 打印现有的 PDF 文件。代码如下:

public void sendToPrinter(){
    File PDFFile = new File("Example.pdf");

    try {
        PDDocument pd = PDDocument.load(PDFFile);
        pd.print();
        pd.close();
    } catch (IOException | PrinterException ex) {
        System.out.println("Error: Couldn't find pdf or printers");
    }
}

但是,当我运行它时,程序冻结在pd.print()。不抛出异常,不出现打印对话框。它只是没有做任何事情。以前有人遇到过这个问题吗?

规格:Mac OS X Yosemite、PDFBox v1.8.9、JDK1.8.0_05、HP Photosmart 打印机

【问题讨论】:

  • 你用的是什么版本?您可以使用 PDFReader 命令行实用程序显示文件吗?您可以使用 PrintPDF 命令行实用程序进行打印吗?每个 PDF 都会发生这种情况,还是只有一个特定的 PDF 会发生这种情况?可以分享一下PDF文件吗?
  • 我使用的是最新版本——1.8.9。我没有使用任何命令行实用程序,但我测试过的所有三个 PDF 文件都在普通 PDF 查看器中打开,但不是在 PDFBox 中。
  • 这是我尝试过的 PDF 之一。它只有 1 页,上面几乎没有任何内容:cl.ly/c0cX/download/nYPhhd.pdf
  • 我用 1.8.9 测试过。它在 PDFReader 中打开,在那里打印,并且还使用您的代码打印。所以原因与您的配置有关。请将其添加到您的问题(操作系统版本、JDK、打印机)中,并在 PDFBox 用户邮件列表中提出相同的问题:mail-archives.apache.org/mod_mbox/pdfbox-users
  • 我得到一个打印对话框。要在没有对话框的情况下打印,请使用silentPrint()。如果可能,请更新您的 JDK。

标签: java pdf printing pdfbox


【解决方案1】:

对于任何有同样问题的人。当我将所有 PDF 工作放到另一个线程上时,我的 print() 命令起作用了。供参考:

public void sendToPrinter() {

        //Create new Task
        Task task = new Task<Boolean>() {
            @Override
            public Boolean call() {

                //Reference the PDF file
                File PDFFile = new File("File.pdf");

                try {
                    //Load PDF & create a Printer Job
                    PDDocument pd = PDDocument.load(PDFFile);
                    PrinterJob job = PrinterJob.getPrinterJob();
                    job.setPageable(new PDFPageable(pd));

                    //Show native print dialog & wait for user to hit "print"
                    if (job.printDialog()) {
                        job.print();
                    }

                    pd.close();
                } catch (IOException | PrinterException ex) {
                }

                return true;
            }
        };
        //Run task on new thread
        new Thread(task).start();

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    相关资源
    最近更新 更多