From 6c3067987f30c1953ec595249221aba3b1784581 Mon Sep 17 00:00:00 2001 From: "valery.bokov" Date: Fri, 10 Apr 2026 21:58:48 +0200 Subject: [PATCH 1/2] release graphics if an exception will be thrown in PDFPrintable.print method --- .../org/apache/pdfbox/printing/PDFPrintable.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java b/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java index fc4ec82dd46..4bf2850fe5a 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java @@ -205,9 +205,13 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { return NO_SUCH_PAGE; } + + Graphics2D printerGraphics = null; + Graphics2D graphics2D = null; + try { - Graphics2D graphics2D = (Graphics2D)graphics; + graphics2D = (Graphics2D)graphics; // capture the DPI that will be used for rasterizing the image // if rasterizing is specified @@ -266,7 +270,6 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) } // rasterize to bitmap (optional) - Graphics2D printerGraphics = null; BufferedImage image = null; if (rasterDpi > 0) { @@ -308,7 +311,6 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) printerGraphics.setBackground(Color.WHITE); printerGraphics.clearRect(0, 0, image.getWidth(), image.getHeight()); printerGraphics.drawImage(image, 0, 0, null); - graphics2D.dispose(); } return PAGE_EXISTS; @@ -317,6 +319,13 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) { throw new PrinterIOException(e); } + finally + { + if (printerGraphics != null) + { + graphics2D.dispose(); + } + } } /** From 64f470ceb51ca263237f3dea0b41998fea997b87 Mon Sep 17 00:00:00 2001 From: "valery.bokov" Date: Sat, 11 Apr 2026 12:16:36 +0200 Subject: [PATCH 2/2] fix potential memory leak if exception will be thrown in PDFPrintable.print --- .../java/org/apache/pdfbox/printing/PDFPrintable.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java b/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java index 4bf2850fe5a..19d3c3a7947 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/printing/PDFPrintable.java @@ -211,7 +211,8 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) try { - graphics2D = (Graphics2D)graphics; + printerGraphics = (Graphics2D)graphics; + graphics2D = printerGraphics; // capture the DPI that will be used for rasterizing the image // if rasterizing is specified @@ -279,7 +280,6 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) (int)(imageableHeight * dpiScale / scale), BufferedImage.TYPE_INT_ARGB); - printerGraphics = graphics2D; graphics2D = image.createGraphics(); // rescale @@ -306,7 +306,7 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) } // draw rasterized bitmap (optional) - if (printerGraphics != null) + if (graphics2D != printerGraphics) { printerGraphics.setBackground(Color.WHITE); printerGraphics.clearRect(0, 0, image.getWidth(), image.getHeight()); @@ -321,7 +321,7 @@ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) } finally { - if (printerGraphics != null) + if (graphics2D != null && graphics2D != printerGraphics) { graphics2D.dispose(); }