Recupere las coordenadas respectivas de todas las palabras en la página con itextsharp

mi objective es recuperar las coordenadas respectivas de todas las palabras en la página, lo que he hecho es

PdfReader reader = new PdfReader("cde.pdf"); TextWithPositionExtractionStategy S = new TextWithPositionExtractionStategy(); PdfTextExtractor.GetTextFromPage(reader,1,S); Vector curBaseline = renderInfo.GetDescentLine().GetStartPoint(); Vector topRight = renderInfo.GetAscentLine().GetEndPoint(); iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(curBaseline[Vector.I1], curBaseline[Vector.I2], topRight[Vector.I1], topRight[Vector.I2]); string x1 = curBaseline[Vector.I1].ToString(); string x2 = curBaseline[Vector.I2].ToString(); string x3 = topRight[Vector.I1].ToString(); string x4 = topRight[Vector.I2].ToString(); 

Pero, lo que obtuve son las coordenadas de una cuerda, que contiene todas las palabras de una línea, no una palabra. Por ejemplo, el contenido del pdf es “soy una niña”, lo que obtuve es la coordenada de “soy un niña “, pero no las coordenadas de” yo “” soy “” una “” niña “. ¿Cómo puedo modificar el código para que pueda obtener la palabra coordenada? Gracias.

(Principalmente estoy trabajando con la biblioteca Java iText, no con la biblioteca .Net iTextSharp; por lo tanto, ignoren algunos ismos Java aquí, todo debería ser fácil de traducir).

Para extraer contenidos de una página usando iText (Sharp), emplea las clases en el paquete de analizador para alimentarlo después de un preprocesamiento a un RenderListener de su elección.

En un contexto en el que solo está interesado en el texto, generalmente usa una TextExtractionStrategy que se deriva de RenderListener y agrega un único método getResultantText para recuperar el texto agregado de la página.

Como la intención inicial del análisis de texto en iText era implementar este caso de uso, la mayoría de los ejemplos de RenderListener existentes son implementaciones de TextExtractionStrategy y solo hacen que el texto esté disponible.

Por lo tanto, tendrá que implementar su propio RenderListener que ya parece haber cristianizado TextWithPositionExtractionStategy .

Al igual que hay una SimpleTextExtractionStrategy (que se implementa con algunas suposiciones sobre la estructura de los operadores de contenido de página) y una LocationTextExtractionStrategy (que no tiene las mismas suposiciones pero es algo más complicada), es posible que desee comenzar con una implementación que hace algunas suposiciones

Por lo tanto, al igual que en el caso de SimpleTextExtractionStrategy , usted en su primera implementación simple espera que los eventos de representación de texto enviados a su oyente lleguen línea por línea y en la misma línea de izquierda a derecha. De esta forma, tan pronto como encuentre un espacio horizontal o un punto de punteo, sabrá que su palabra actual está terminada y podrá procesarla.

A diferencia de las estrategias de extracción de texto, no necesita un miembro de StringBuffer para recostackr su resultado, sino una lista de alguna estructura de “palabra con posición”. Además, necesita alguna variable miembro para contener los eventos TextRenderInfo que ya recopiló para esta página pero que finalmente no pudo procesar (puede recuperar una palabra en varios eventos separados).

Tan pronto como usted (es decir, su método renderText ) sea llamado para un nuevo objeto TextRenderInfo , debería operar así (pseudo-código):

 if (unprocessedTextRenderInfos not empty) { if (isNewLine // Check this like the simple text extraction strategy checks for hardReturn || isGapFromPrevious) // Check this like the simple text extraction strategy checks whether to insert a space { process(unprocessedTextRenderInfos); unprocessedTextRenderInfos.clear(); } } split new TextRenderInfo using its getCharacterRenderInfos() method; while (characterRenderInfos contain word end) { add characterRenderInfos up to excluding the white space/punctuation to unprocessedTextRenderInfos; process(unprocessedTextRenderInfos); unprocessedTextRenderInfos.clear(); remove used render infos from characterRenderInfos; } add remaining characterRenderInfos to unprocessedTextRenderInfos; 

En process(unprocessedTextRenderInfos) , extrae la información que necesita de la versión no procesada TextRenderInfos; concatenas los contenidos de texto individuales a una palabra y tomas las coordenadas que deseas; si solo quiere comenzar las coordenadas, tome aquellas del primero de esos TextRenderInfos no procesados. Si necesita más datos, también utiliza los datos de los otros TextRenderInfos. Con estos datos, rellena una estructura de “palabra con posición” y la agrega a su lista de resultados.

Cuando finaliza el procesamiento de la página, debe volver a llamar al proceso (unprocessedTextRenderInfos) y unprocessedTextRenderInfos.clear (); alternativamente, puede hacer eso en el método endTextBlock .

Una vez hecho esto, puede sentirse listo para implementar la variante un poco más compleja que no tiene los mismos supuestos sobre la estructura de contenido de la página. 😉