Mejorando la extracción de texto de PDFs de varias columnas
Contents
[
Hide
]
Los diseños de varias columnas a menudo requieren procesamiento adicional para mejorar el orden de lectura y la calidad de la extracción.
Extraer texto después de reducir el tamaño de fuente
Esta técnica actualiza los tamaños de fuente del fragmento de texto, guarda el documento ajustado en la memoria y luego extrae texto del resultado transformado.
- Abra el PDF de origen en una instancia de
Document. - Cree un
TextFragmentAbsorbery visite todas las páginas del documento para recopilarTextFragmentobjetos. - Itere a través de los fragmentos y reduzca el tamaño de cada fuente por la proporción solicitada para que el diseño de columnas densas pueda normalizarse antes de la extracción.
- Guarde lo ajustado
Documenten un flujo de bytes en memoria. - Reabra un segundo
Documentdesde ese búfer de memoria. - Cree un
TextAbsorber, visita todas las páginas del documento transformado, y escriba el texto extraído en el archivo de salida.
public static void extractTextReduceFont(Path inputFile, Path outputFile, double reduceRatio) throws Exception {
try (Document document = new Document(inputFile.toString())) {
TextFragmentAbsorber fragmentAbsorber = new TextFragmentAbsorber();
document.getPages().accept(fragmentAbsorber);
for (TextFragment fragment : fragmentAbsorber.getTextFragments()) {
fragment.getTextState().setFontSize((float) (fragment.getTextState().getFontSize() * reduceRatio));
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
document.save(stream);
try (Document document2 = new Document(new ByteArrayInputStream(stream.toByteArray()))) {
TextAbsorber textAbsorber = new TextAbsorber();
document2.getPages().accept(textAbsorber);
Files.writeString(outputFile, textAbsorber.getText());
}
}
}
Extraer texto con un factor de escala
Utilice TextExtractionOptions en modo de formato puro y ajuste el factor de escala para diseños con muchas columnas.
- Abra el PDF de origen en una instancia de
Document. - Cree un
TextAbsorberpara la extracción de documento completo. - Cree
TextExtractionOptionsen modo de formato puro para que se utilice el comportamiento de extracción sensible al diseño. - Establezca el factor de escala y aplique las opciones de extracción al absorbente antes de visitar las páginas.
- Visite todas las páginas del documento y escriba el texto extraído en el archivo de salida.
public static void extractTextScaleFactor(Path inputFile, Path outputFile, double scaleFactor) throws Exception {
try (Document document = new Document(inputFile.toString())) {
TextAbsorber textAbsorber = new TextAbsorber();
TextExtractionOptions extractionOptions =
new TextExtractionOptions(TextExtractionOptions.TextFormattingMode.Pure);
extractionOptions.setScaleFactor(scaleFactor);
textAbsorber.setExtractionOptions(extractionOptions);
document.getPages().accept(textAbsorber);
Files.writeString(outputFile, textAbsorber.getText());
}
}