0
我有一個軟件直接用默認打印機打印PDF文件的問題。有時我會在用戶打印PDF文件時收到OutOfMemoryError,但我不知道是什麼問題。PDFBox outofmemory當打印
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並使用Java打印PDF文件。
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);
}
謝謝@Maruan Sahyoun,我將改變代碼使用'PDDocument.load(文件,MemoryUsageSetting.setupTempFileOnly())'而不是'PDDocument.load(文件)' – fjtorres
在審查了問題後,我發現了一件事。當我發送打印PDF文件的作業時,我可以看到打印機隊列中的大小,它太大了。例如,包含268頁的文檔顯示大小約爲8 GB。 這很奇怪,例如打印使用福昕閱讀器的文檔大小是57 MB左右。 文檔的實際大小爲12 MB,我使用Windows 7檢查作業大小。 – fjtorres
@fjtorres這很可能是因爲該文檔在由Java Printing API打印之前進行了光柵化處理。 –