Mejorando la extracción de texto de PDFs de varias columnas

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.

  1. Abra el PDF de origen en una instancia de Document.
  2. Cree un TextFragmentAbsorber y visite todas las páginas del documento para recopilar TextFragment objetos.
  3. 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.
  4. Guarde lo ajustado Document en un flujo de bytes en memoria.
  5. Reabra un segundo Document desde ese búfer de memoria.
  6. 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.

  1. Abra el PDF de origen en una instancia de Document.
  2. Cree un TextAbsorber para la extracción de documento completo.
  3. Cree TextExtractionOptions en modo de formato puro para que se utilice el comportamiento de extracción sensible al diseño.
  4. Establezca el factor de escala y aplique las opciones de extracción al absorbente antes de visitar las páginas.
  5. 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());
    }
}