静音打印时Mac上的PDFBox严重错误 [英] PDFBox on Mac critical error when silent printing

查看:134
本文介绍了静音打印时Mac上的PDFBox严重错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试将对PDFBox的应用程序依赖性提高到2.0.0快照. 我在遇到一些重大问题...

I have been experimenting with bumping my applications dependency on PDFBox to the 2.0.0 snapshot. I'm having some major issues with it though...

因此,我的代码将PDF接收为BASE64字符串,我对其进行了解码,然后将结果字节数组加载到PDDocument中.在更改版本号之前,在PDDocument上调用.silentPrint();就像一个超级按钮.

So my code recieves a PDF as a BASE64 String, i decode it, and load the resulting bytearray into a PDDocument. Before I bumped the version number, calling .silentPrint();on the PDDocument worked like a charm.

静默打印的实现在2.0.0中进行了更改,现在我是这样进行的:

The implementation of silent printing changed in 2.0.0, and I now do it this way:

private Status doPdfPrint(Document document, PrintService printService) {
    ByteArrayInputStream bais = null;
    PDDocument doc = null;
    PrinterJob printerJob = PrinterJob.getPrinterJob();

    try {
        printerJob.setPrintService(printService);
        bais = new ByteArrayInputStream(document.getDecodedData());

        doc = PDDocument.load(bais, true); //Force load

        PDFPrinter pdfPrinter = new PDFPrinter(doc);
        pdfPrinter.silentPrint(printerJob);

        doc.close();
        bais.close();
    } catch (IOException | PrinterException e) {
        log.warn("Failed to print! Exception occurred: {}", e.getMessage());
        log.debug("EXCEPTION", e);
        return Status.PRINTING_FAILED;
    } finally {
        IOUtils.closeQuietly(bais);
        IOUtils.closeQuietly(doc);
    }
    return Status.PRINTING_OK;
}

但是,在OSX Yosemite上运行时,结果为:

However, when running this on OSX Yosemite, this results in:

2015-02-12 08:10:44.475 java[20264:1353636] Cocoa AWT: Not running on AppKit thread 0 when expected. (
0   libosxapp.dylib                     0x0000000125997782 +[ThreadUtilities getJNIEnv] + 38
1   libawt_lwawt.dylib                  0x000000012bf3004d syncFromJavaPixels + 1842
2   libawt_lwawt.dylib                  0x000000012bf304e3 LockImage + 75
3   libawt_lwawt.dylib                  0x000000012bf43040 Java_sun_java2d_CRenderer_doImage + 170
4   ???                                 0x0000000108c15694 0x0 + 4441855636
5   ???                                 0x0000000108c0798d 0x0 + 4441799053
)
2015-02-12 08:10:44.475 java[20264:1353636]     Please file a bug     report at http://java.net/jira/browse/MACOSX_PORT with this message and a reproducible test case.
2015-02-12 08:10:44.478 java[20264:1353636] java.lang.StackOverflowError
at sun.java2d.CRenderer.doImage(Native Method)
at sun.java2d.OSXSurfaceData.blitImage(OSXSurfaceData.java:1027)
at sun.java2d.CRenderer.blitImage(CRenderer.java:461)
at sun.java2d.CRenderer.scaleImage(CRenderer.java:455)
at sun.java2d.CRenderer.transformImage(CRenderer.java:508)
at sun.java2d.CRenderer.transformImage(CRenderer.java:582)
at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3461)
at sun.print.ProxyGraphics2D.drawImage(ProxyGraphics2D.java:1315)
at  org.apache.pdfbox.rendering.PageDrawer.drawBufferedImage(PageDrawer.java:755)
at org.apache.pdfbox.rendering.PageDrawer.drawImage(PageDrawer.java:719)
at org.apache.pdfbox.contentstream.operator.graphics.DrawObject.process(DrawObject.java:51)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:802)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:464)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:438)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:149)
at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:160)
at org.apache.pdfbox.rendering.PDFRenderer.renderPage(PDFRenderer.java:203)
at org.apache.pdfbox.rendering.PDFRenderer.renderPageToGraphics(PDFRenderer.java:166)
at org.apache.pdfbox.printing.PDFPrinter$PDFPrintable.print(PDFPrinter.java:430)
at sun.lwawt.macosx.CPrinterJob$4.run(CPrinterJob.java:653)
at sun.lwawt.macosx.CPrinterJob.printToPathGraphics(CPrinterJob.java:667)
at sun.lwawt.macosx.CPrinterJob.printLoop(Native Method)
at sun.lwawt.macosx.CPrinterJob.print(CPrinterJob.java:303)
at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1323)
at org.apache.pdfbox.printing.PDFPrinter.print(PDFPrinter.java:250)
at org.apache.pdfbox.printing.PDFPrinter.silentPrint(PDFPrinter.java:182)
at com.memnon.printr.PrintHandler.doPdfPrint(PrintHandler.java:123)
at com.memnon.printr.PrintHandler.print(PrintHandler.java:87)
at com.memnon.printr.PrintHandler.print(PrintHandler.java:77)
at com.memnon.printr.PrintHandler.print(PrintHandler.java:48)
at com.memnon.printr.communication.DocumentResponseHandler.handleSuccessful(DocumentResponseHandler.java:78)
at com.memnon.printr.communication.DocumentResponseHandler.handle(DocumentResponseHandler.java:53)
at com.memnon.printr.messaging.PrintConsumer.executePrinterJob(PrintConsumer.java:62)
at com.memnon.printr.messaging.PrintConsumer.run(PrintConsumer.java:44)
at java.lang.Thread.run(Thread.java:745)
2015-02-12 08:10:44.493 java[20264:1353636] NSAlert is being used from a background thread, which is not safe.  This is probably going to crash sometimes. Break on void _NSAlertWarnUnsafeBackgroundThreadUsage() to debug.  This will be logged only once.  This may break in the future.
2015-02-12 08:10:46.639 java[20264:1353636] Apple AWT Internal Exception: Printing failed because PMSessionEndDocumentNoDialog() returned -30871.
2015-02-12 08:10:46.639 java[20264:1353636] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Printing failed because PMSessionEndDocumentNoDialog() returned -30871.'
*** First throw call stack:
(
0   CoreFoundation                      0x00007fff8895c66c __exceptionPreprocess + 172
1   libobjc.A.dylib                     0x00007fff890e876e objc_exception_throw + 43
2   CoreFoundation                      0x00007fff8895c51d +[NSException raise:format:] + 205
3   AppKit                              0x00007fff8d117e80 -[NSPrintSpoolingGraphicsContext dealloc] + 43
4   libobjc.A.dylib                     0x00007fff890fb89c _ZN11objc_object17sidetable_releaseEb + 236
5   libobjc.A.dylib                     0x00007fff890e1e8f _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 575
6   CoreFoundation                      0x00007fff88834302 _CFAutoreleasePoolPop + 50
7   libawt_lwawt.dylib                  0x000000012bf25fa4 Java_sun_lwawt_macosx_CPrinterJob_printLoop + 165
8   ???                                 0x0000000108c15694 0x0 + 4441855636
9   ???                                 0x0000000108c07160 0x0 + 4441796960
10  ???                                 0x0000000108c0798d 0x0 + 4441799053
)
libc++abi.dylib: terminating with uncaught exception of type NSException

知道发生了什么吗? 问候

Any idea what's going on? Regards

推荐答案

因此,我是在第一次发生这种情况2年后发布在这里的.

So I'm posting here 2 years after this occured for the first time..

它仍在发生.但是,这是Java错误,而不是PDFBox错误.因此,在将错误报告提交到PDFBox问题跟踪器之后,我得到了建议,在进行打印时为文档设置DPI.瞧,它有效.但是,要弄清楚pdf文档的DPI几乎是不可能的.

It's still occuring. However, it's a Java bug, rather then a PDFBox bug. So after filing my bugreport on PDFBox issue-tracker, I got the advice to set a DPI for the document when doing printing. And voila it works. However, it's nearly impossible to figure out the DPI of a pdf document.

但是,如果您知道DPI是什么,则只需执行以下操作:

However, if you know what the DPI is, you can simply do this:

final int rasterizedDpi = 203;
final PDDocument pdfDocument = PDDocument.load(data);
final PrinterJob job = PrinterJob.getPrinterJob();
final PDFPageable pageable = new PDFPageable(pdfDocument, Orientation.AUTO, false, rasterizedDpi);
job.setPageable(pageable);
job.print();

这里的提示是PDFPageable的第四个参数dpi ...

The hint here is the 4th argument to PDFPageable, the dpi...

在Oracle修复此JDK错误之前,我想我们将不得不调用此方法:)

Until Oracle fixes this JDK bug, i guess we're going to have to call this method :)

这篇关于静音打印时Mac上的PDFBox严重错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆