@@ -210,75 +210,75 @@ private String compareImages(String outImage, String cmpImage, String difference
210210
211211 private Map <Integer , PageImageObjectsPaths > extractImagesFromPdf (String pdf , String outputPath )
212212 throws IOException , InterruptedException {
213- PdfDocument pdfDoc = new PdfDocument (new PdfReader (pdf ));
214- Map <Integer , PageImageObjectsPaths > imageObjectDatas = new HashMap <>();
215-
216- for (int i = 1 ; i <= pdfDoc .getNumberOfPages (); i ++) {
217- PdfPage page = pdfDoc .getPage (i );
218- PageImageObjectsPaths imageObjectData =
219- new PageImageObjectsPaths (page .getPdfObject ().getIndirectReference ());
220- Stack <ObjectPath .LocalPathItem > baseLocalPath = new Stack <ObjectPath .LocalPathItem >();
221-
222- PdfResources pdfResources = page .getResources ();
223- if (pdfResources .getPdfObject ().isIndirect ()) {
224- imageObjectData .addIndirectReference (pdfResources .getPdfObject ().getIndirectReference ());
225- } else {
226- baseLocalPath .push (new ObjectPath ().new DictPathItem (PdfName .Resources ));
227- }
228-
229- PdfDictionary xObjects = pdfResources .getResource (PdfName .XObject );
230- if (xObjects == null ) {
231- continue ;
232- }
233-
234- if (xObjects .isIndirect ()) {
235- imageObjectData .addIndirectReference (xObjects .getIndirectReference ());
236- baseLocalPath .clear ();
237- } else {
238- baseLocalPath .push (new ObjectPath ().new DictPathItem (PdfName .XObject ));
239- }
213+ try (PdfReader readerPdf = new PdfReader (pdf );
214+ PdfDocument pdfDoc = new PdfDocument (readerPdf )) {
215+ Map <Integer , PageImageObjectsPaths > imageObjectDatas = new HashMap <>();
216+
217+ for (int i = 1 ; i <= pdfDoc .getNumberOfPages (); i ++) {
218+ PdfPage page = pdfDoc .getPage (i );
219+ PageImageObjectsPaths imageObjectData =
220+ new PageImageObjectsPaths (page .getPdfObject ().getIndirectReference ());
221+ Stack <ObjectPath .LocalPathItem > baseLocalPath = new Stack <ObjectPath .LocalPathItem >();
222+
223+ PdfResources pdfResources = page .getResources ();
224+ if (pdfResources .getPdfObject ().isIndirect ()) {
225+ imageObjectData .addIndirectReference (pdfResources .getPdfObject ().getIndirectReference ());
226+ } else {
227+ baseLocalPath .push (new ObjectPath ().new DictPathItem (PdfName .Resources ));
228+ }
240229
241- boolean isPageToGsExtract = false ;
242- for (PdfName objectName : xObjects .keySet ()) {
243- if (!xObjects .get (objectName ).isStream ()
244- || !PdfName .Image .equals (xObjects .getAsStream (objectName ).getAsName (PdfName .Subtype ))) {
230+ PdfDictionary xObjects = pdfResources .getResource (PdfName .XObject );
231+ if (xObjects == null ) {
245232 continue ;
246233 }
247234
248- PdfImageXObject pdfObject = new PdfImageXObject (xObjects .getAsStream (objectName ));
249- baseLocalPath .push (new ObjectPath ().new DictPathItem (objectName ));
250-
251- if (!useGs ) {
252- String extension = pdfObject .identifyImageFileExtension ();
253- String fileName = outputPath + objectName + "_" + i + "." + extension ;
254- createImageFromPdfXObject (fileName , pdfObject );
235+ if (xObjects .isIndirect ()) {
236+ imageObjectData .addIndirectReference (xObjects .getIndirectReference ());
237+ baseLocalPath .clear ();
255238 } else {
256- isPageToGsExtract = true ;
239+ baseLocalPath . push ( new ObjectPath (). new DictPathItem ( PdfName . XObject )) ;
257240 }
258241
259- Stack <ObjectPath .LocalPathItem > reversedStack = new Stack <>();
260- reversedStack .addAll (baseLocalPath );
261- Stack <ObjectPath .LocalPathItem > resultStack = new Stack <>();
262- resultStack .addAll (reversedStack );
263- imageObjectData .addLocalPath (resultStack );
264- baseLocalPath .pop ();
265- }
242+ boolean isPageToGsExtract = false ;
243+ for (PdfName objectName : xObjects .keySet ()) {
244+ if (!xObjects .get (objectName ).isStream ()
245+ || !PdfName .Image .equals (xObjects .getAsStream (objectName ).getAsName (PdfName .Subtype ))) {
246+ continue ;
247+ }
266248
267- if (useGs && isPageToGsExtract ) {
268- String fileName = "Page_" + i + "-%03d.png" ;
269- ghostscriptHelper .runGhostScriptImageGeneration (pdf , outputPath , fileName , String .valueOf (i ));
270- }
249+ PdfImageXObject pdfObject = new PdfImageXObject (xObjects .getAsStream (objectName ));
250+ baseLocalPath .push (new ObjectPath ().new DictPathItem (objectName ));
271251
272- ImageRenderListener listener = new ImageRenderListener ();
273- PdfCanvasProcessor parser = new PdfCanvasProcessor (listener );
274- parser .processPageContent (page );
275- ignoredImagesAreas .put (i , listener .getImageRectangles ());
252+ if (!useGs ) {
253+ String extension = pdfObject .identifyImageFileExtension ();
254+ String fileName = outputPath + objectName + "_" + i + "." + extension ;
255+ createImageFromPdfXObject (fileName , pdfObject );
256+ } else {
257+ isPageToGsExtract = true ;
258+ }
276259
277- imageObjectDatas .put (i , imageObjectData );
278- }
260+ Stack <ObjectPath .LocalPathItem > reversedStack = new Stack <>();
261+ reversedStack .addAll (baseLocalPath );
262+ Stack <ObjectPath .LocalPathItem > resultStack = new Stack <>();
263+ resultStack .addAll (reversedStack );
264+ imageObjectData .addLocalPath (resultStack );
265+ baseLocalPath .pop ();
266+ }
279267
280- pdfDoc .close ();
281- return imageObjectDatas ;
268+ if (useGs && isPageToGsExtract ) {
269+ String fileName = "Page_" + i + "-%03d.png" ;
270+ ghostscriptHelper .runGhostScriptImageGeneration (pdf , outputPath , fileName , String .valueOf (i ));
271+ }
272+
273+ ImageRenderListener listener = new ImageRenderListener ();
274+ PdfCanvasProcessor parser = new PdfCanvasProcessor (listener );
275+ parser .processPageContent (page );
276+ ignoredImagesAreas .put (i , listener .getImageRectangles ());
277+
278+ imageObjectDatas .put (i , imageObjectData );
279+ }
280+ return imageObjectDatas ;
281+ }
282282 }
283283
284284 private void createImageFromPdfXObject (String imageFileName , PdfImageXObject imageObject )
0 commit comments