Estrazione del testo in un'area specifica della pagina PDF utilizzando ICEpdf
-
27-10-2019 - |
Domanda
Esiste un modo per estrarre il testo di una regione specifica utilizzando ICEpdf?Sono stato in grado di estrarre intere pagine, ma non è quello che voglio fare.
(So che PDFBox estrae bene il testo in una specifica area rettangolare di una pagina.Tuttavia, poiché il rendering delle immagini funziona molto meglio in ICEpdf, mi piacerebbe utilizzare quella libreria.)
Soluzione
Sull'oggetto Page che rappresenta una pagina puoi chiamare il metodo:
PageText pageText = document.getPageText(pagNumber);
Simile all'esempio del bundle ./examples/extraction/PageTextExtraction.java
L'oggetto PageText contiene tutti gli oggetti LineText->WordText->GlyphText per la pagina.LineText, WordText e GlyphText estendono tutti AbstractText che ha un metodo getBounds().I limiti di questi oggetti sono nello spazio utente PDF, il primo quadrante geometrico.Java2D si trova nel 4° quadrante geometrico.Supponendo che tu abbia già la selezione Rettangolo, il codice sarebbe il seguente:
// the currently selected state, ignore highlighted. currentPage.getViewText().clearSelected(); // get page transform, same for all calculations AffineTransform pageTransform = currentPage.getPageTransform( Page.BOUNDARY_CROPBOX, documentViewModel.getViewRotation(), documentViewModel.getViewZoom()); Rectangle2D.Float pageSpaceSelectRectangle = convertRectangleToPageSpace(selectionRectangle, pageTransform); ArrayList pageLines = pageText.getPageLines(); for (LineText pageLine : pageLines) { // check for containment, if so break into words. if (pageLine.getBounds().intersects(pageSpaceSelectRectangle )) { // you have some selected text. } } /** * Converts the rectangle to the space specified by the page tranform. This * is a utility method for converting a selection rectangle to page space * so that an intersection can be calculated to determine a selected state. * * @param mouseRect rectangle to convert space of * @param pageTransform page transform * @return converted rectangle. */ private Rectangle2D convertRectangleToPageSpace(Rectangle mouseRect, AffineTransform pageTransform) { GeneralPath shapePath; try { AffineTransform tranform = pageTransform.createInverse(); shapePath = new GeneralPath(mouseRect); shapePath.transform(tranform); return shapePath.getBounds2D(); } catch (NoninvertibleTransformException e) { logger.log(Level.SEVERE, "Error converting mouse point to page space.", e); } return null; }
Altri suggerimenti
Hai postato sui forum icepdf?Di solito sono molto bravi a rispondere alle domande lì?