При попытке распечатать JPEG через FileInputStream с использованием API сервиса печати Java, мы иногда получаем следующее исключение:
Caused by: java.lang.InternalError: Problem in WPrinterJob_drawDIBImage
at sun.awt.windows.WPrinterJob.drawDIBImage(Native Method)
at sun.awt.windows.WPrinterJob.drawDIBImage(Unknown Source)
at sun.awt.windows.WPathGraphics.drawImageToPlatform(Unknown Source)
at sun.print.PathGraphics.drawImage(Unknown Source)
at sun.print.PathGraphics.drawImage(Unknown Source)
at sun.print.ImagePrinter.print(Unknown Source)
at sun.print.RasterPrinterJob.printPage(Unknown Source)
at sun.print.RasterPrinterJob.print(Unknown Source)
at sun.print.Win32PrintJob.printableJob(Unknown Source)
at sun.print.Win32PrintJob.print(Unknown Source)
at com.magicmemories.mpower.printing.AbstractPrinter.printDoc(Unknown Source)
at com.magicmemories.mpower.printing.JPEGPrinter.print(Unknown Source)
at com.magicmemories.mpower.printing.PrintProducer.print(Unknown Source)
at com.magicmemories.mpower.product.D2PProducer.produce(Unknown Source)
at com.magicmemories.mpower.tasks.PrintProductTask.call(Unknown Source)
at com.magicmemories.mpower.tasks.PrintProductTask.call(Unknown Source)
... 5 more
Код для печати выглядит следующим образом:
Doc printDoc = new SimpleDoc(new FileInputStream(jpegFile), DocFlavor.INPUT_STREAM.JPEG, null);
DocPrintJob printJob = printService.createPrintJob();
printJob.print(printDoc, printAttributes);
Фактический JPEG, который мы печатаем, генерируется динамически - обычно он составляет около 2 МБ. Я взял несколько изображений, которые не удалось распечатать, и провел их через тестовый скрипт, который выполняет те же самые вызовы API, поэтому я уверен, что с самими изображениями все в порядке.
Исключение не возникает каждый раз, только один раз каждые 50 или 100 отпечатков. Это было замечено в 32-битных Java 6 Oracle JVM, как в обновлении 26, так и в обновлении 30. Поскольку оно было прерывистым, мы предположили, что это какая-то проблема с памятью. Мы наблюдали за приложением в jconsole во время его печати, и было выдано исключение, когда на нем было более 100 МБ свободного места в куче. В настоящее время приложение работает с 1 ГБ пространства кучи на коробке WinXP с 2 ГБ ОЗУ. Мы разместили заказ на покупку дополнительной оперативной памяти, чтобы попытаться увеличить пространство кучи, но, поскольку он, похоже, в любом случае не достигает своего предела, мы не надеемся, что это исправит это.
Пока мы ожидаем поступления дополнительной оперативной памяти, можем ли мы что-нибудь еще сделать, чтобы решить эту проблему?