2017-04-24 50 views
0

デフォルトのプリンタで直接PDFファイルを印刷するソフトウェアに問題があります。ユーザーがPDFファイルを印刷するときにOutOfMemoryErrorを受け取ることがありますが、問題の原因がわかりません。印刷時にPDFBoxのメモリが空になる

java.lang.OutOfMemoryError: Java heap space 
    at java.awt.image.DataBufferInt.<init>(Unknown Source) 
    at java.awt.image.Raster.createPackedRaster(Unknown Source) 
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source) 
    at java.awt.image.BufferedImage.<init>(Unknown Source) 
    at org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray.toRGBImage(PDDeviceGray.java:78) 
    at org.apache.pdfbox.pdmodel.graphics.image.SampledImageReader.from1Bit(SampledImageReader.java:216) 
    at org.apache.pdfbox.pdmodel.graphics.image.SampledImageReader.getRGBImage(SampledImageReader.java:142) 
    at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.getImage(PDImageXObject.java:340) 
    at org.apache.pdfbox.rendering.PageDrawer.drawImage(PageDrawer.java:793) 
    at org.apache.pdfbox.contentstream.operator.graphics.DrawObject.process(DrawObject.java:62) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:815) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:472) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:446) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.showForm(PDFStreamEngine.java:178) 
    at org.apache.pdfbox.contentstream.operator.graphics.DrawObject.process(DrawObject.java:70) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:815) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:472) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:446) 
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:149) 
    at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:189) 
    at org.apache.pdfbox.rendering.PDFRenderer.renderPage(PDFRenderer.java:208) 
    at org.apache.pdfbox.rendering.PDFRenderer.renderPageToGraphics(PDFRenderer.java:169) 
    at org.apache.pdfbox.printing.PDFPrintable.print(PDFPrintable.java:184) 
    at sun.print.RasterPrinterJob.printPage(Unknown Source) 
    at sun.print.RasterPrinterJob.print(Unknown Source) 

このコードを使用して、PDFBoxでPDFファイルを読み込んでJavaで印刷します。

try (PDDocument doc = PDDocument.load(fileToPrint)) { 

    PrinterJob job = PrinterJob.getPrinterJob(); 

    job.setJobName(jobName); 
    job.setPageable(new PDFPageable(doc, Orientation.AUTO, false, 300)); 
    job.setPrintService(printerService); 

    ... 

    job.print(attributes); 

    ... 

} catch (IOException e) { 
    ... 
} catch (PrinterException e) { 
    ... 
} 

PDFBox

@Test 
    public void currentVersionTest() throws IOException, PrinterException { 

     String jobName = testDocumentPdf.getFileName().toString(); 

     try (PDDocument doc = PDDocument.load(testDocumentPdf.toFile(), MemoryUsageSetting.setupTempFileOnly())) { 

     PrinterJob job = PrinterJob.getPrinterJob(); 

     job.setJobName(jobName); 
     job.setPageable(new PDFPageable(doc, Orientation.AUTO, false, 0)); 
     job.setPrintService(printService); 

     PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); 
     attributes.add(Chromaticity.MONOCHROME); 

     job.print(attributes); 

     } 

     checkJobInQueue(jobName); 
    } 

答えて

1

で印刷する方法は、メモリの消費量は、このようなように画像の数、DPIの設定とのようないくつかの要因に依存しています。アプリケーションのメモリ設定を調整する必要があるかもしれません。

メモリのニーズや設定を改善するための提案については、https://pdfbox.apache.org/2.0/faq.html#outofmemoryerrorをご覧ください。

+0

ありがとうございます@Maruan Sahyoun、私は 'PDDocument.load(file)'の代わりに 'PDDocument.load(file、MemoryUsageSetting.setupTempFileOnly())'を使用するコードを変更します – fjtorres

+0

問題を見直した後、ジョブを送信してPDFファイルを印刷すると、プリンタのキューにサイズが表示され、大きすぎます。たとえば、268ページの文書が、約8GBのサイズで表示されます。 Foxit Readerを使った文書のサイズが約57MBの文書を印刷するなど、非常に奇妙です。 ドキュメントの実際のサイズは12 MBで、Windows 7を使用してジョブサイズを確認しています。 – fjtorres

+0

@fjtorresこれは、Java Printing APIで印刷する前に文書をラスタライズしている可能性が高いためです。 –

関連する問題