[ 
https://issues.apache.org/jira/browse/PDFBOX-2682?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14592289#comment-14592289
 ] 

Emmeran Seehuber commented on PDFBOX-2682:
------------------------------------------

My workaround for now is to render the pages to an image and then print that 
image.

{code}
final PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfData));
final PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setJobName(jobName);
printJob.setPrintService(printer);
final PDFPrinter pdfPrinter = new PDFPrinter(document, printJob);
if (!MacUISetup.isMac()) {
        pdfPrinter.silentPrint();
} else {
        final Pageable pageable = pdfPrinter.getPageable();
        final PDFRenderer pdfRenderer = new PDFRenderer(document);
        printJob.setPageable(new Pageable() {
                @Override
                public int getNumberOfPages() {
                        return pageable.getNumberOfPages();
                }

                @Override
                public PageFormat getPageFormat(int pageIndex) throws 
IndexOutOfBoundsException {
                        return pageable.getPageFormat(pageIndex);
                }

                @Override
                public Printable getPrintable(int pageIndex) throws 
IndexOutOfBoundsException {
                        return new Printable() {
                                @Override
                                public int print(Graphics graphics, PageFormat 
pageFormat, int pageIndex)
                                                throws PrinterException {
                                        if (pageIndex < 0 || pageIndex >= 
document.getNumberOfPages()) {
                                                return NO_SUCH_PAGE;
                                        }

                                        float dpi = 600;
                                        try {
                                                BufferedImage image = 
pdfRenderer.renderImageWithDPI(pageIndex, dpi,
                                                                ImageType.RGB);

                                                // Render the image
                                                Graphics2D printerGraphics = 
(Graphics2D) graphics;
                                                
printerGraphics.setBackground(Color.WHITE);
                                                
printerGraphics.translate(pageFormat.getImageableX(),
                                                                
pageFormat.getImageableY());
                                                printerGraphics.scale(
                                                                
pageFormat.getImageableWidth() / (double) image.getWidth(),
                                                                
pageFormat.getImageableHeight() / (double) image.getHeight());

                                                
printerGraphics.drawImage(image, 0, 0, null);
                                        } catch (IOException e) {
                                                e.printStackTrace();
                                        }
                                        return PAGE_EXISTS;
                                }
                        };
                }
        });
        printJob.print();
}

document.close();
{code}

This works for me, but the printed image does not look as sharp as printed 
vector shapes do ... On all other platforms I just use silentPrint() and 
everything is fine. 

I did not use the PDFPrinter dpi argument, because the image was clipped when 
printed out. (Something is wrong with the scaling in this case).

> Silent Print on Mac OSX complains it's not ran on Cocoa AWT thread
> ------------------------------------------------------------------
>
>                 Key: PDFBOX-2682
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-2682
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 2.0.0
>         Environment: Mac OSX 10.10.2
> 2,8 GHz Intel Core i7
> JDK 8u20
>            Reporter: Robin Jonsson
>            Priority: Critical
>         Attachments: TMPPRINTFILE.pdf
>
>
> I recently tested upgrading the PDFBox version in my project from 1.8.8 to 
> 2.0.0-SNAPSHOT
> I ran into problems when printing silently via PDFPrinter.java
> I ran this code:
> {code}
> 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.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;
>     }
> {code}
> *Which resulted in the following stacktrace:*
> {code}
> 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
> {code}
> I saved the byte array output to a file and attached it to this case.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: dev-h...@pdfbox.apache.org

Reply via email to