2012-02-26 46 views
11

Soy nuevo en pdfbox y quiero extraer un párrafo que coincida con algunas palabras en particular y puedo extraer todo el pdf a texto (bloc de notas) pero no tengo idea de cómo extraer un párrafo en particular para mi programa java. ¿Alguien puede ayudarme con este al menos algunos tutoriales o ejemplos. Gracias tantoPDFBox extracción de párrafos

Respuesta

14

El texto en documentos PDF está absolutamente posicionado. Así que en lugar de palabras , líneas y párrafos , sólo se ha posicionado absolutamente caracteres.

Digamos que usted tiene un párrafo:

Neque Porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velita

En términos generales, en el archivo PDF que estarán representados como personajes N en alguna posición, e un poco derecho a ella, q, u, e más a la derecha, etc.

PDFBox intenta adivinar cómo los personajes hacen palabras, líneas y párrafos. Por lo tanto, buscará una gran cantidad de personajes en aproximadamente la misma posición vertical, para grupos de personajes que estén cerca entre sí y similares para tratar de encontrar lo que necesita. Lo hace extrayendo el texto de toda la página y luego procesándolo carácter por carácter para crear texto (también puede intentar extraer texto de solo un área rectangular dentro de una página). Consulte la clase correspondiente PDFTextStripper (o PDFTextStripperByArea). Para el uso, vea ExtractText.java en fuentes PDFBox.

Eso significa que no puede extraer párrafos fácilmente utilizando PDFBox. También significa que PDFBox puede, y algunas veces se perderá, al extraer texto (hay muchos documentos PDF muy diferentes).

Lo que puede hacer es extraer el texto de la página entera y luego tratar de encontrar su párrafo buscando a través de ese texto. Regular expressions son generalmente adecuados para tales tareas (disponibles en Java a través de las clases y Matcher, o métodos de conveniencia en la clase String).

+0

Muchas gracias. Así que no puedo usar pdfbox para extraer un párrafo, en su lugar necesito usar el archivo de texto generado para extraer el párrafo usando la coincidencia de patrones. Gracias por la información. – scc

1

He detectado el comienzo del párrafo utilizando el siguiente enfoque. Lea la página línea por línea. Para cada línea: -

  1. Encuentra el último índice de '.' (punto) en la línea.
  2. Compare este índice con la longitud de la línea de entrada.
  3. Si el índice es menor, esto implica que este no es el final del párrafo anterior.
  4. Si es así, indica que el párrafo anterior ha finalizado y la siguiente línea será el comienzo del nuevo párrafo.

Espero que esto ayude.

+0

Rompí el texto línea por línea y tenía requisitos adicionales, pero eso fue hace mucho tiempo, ¡gracias por la respuesta! – scc

0

Después de la extracción de texto, el párrafo puede ser construido teniendo en cuenta mediante programación siguientes puntos:

  1. Todas las líneas se inicia con deben unirse con la línea anterior minúsculas. Pero una línea que comienza con mayúscula también puede requerir unirse a la línea anterior. por ejemplo: para expresión citada.

  2. .,?,!," Terminando la línea con estos personajes puede ser el final del párrafo. No siempre.

  3. Si mediante programación se determina un párrafo, a continuación, probar por un número par de comillas. Esto puede ser de doble comilla simple o doble apertura Unicode y las comillas de cierre.

0
Try this: 

private static String getParagraphs(String filePath, int linecount) throws IOException { 
    ParagraphDetector paragraphDetector = new ParagraphDetector(); 
    StringBuilder extracted = new StringBuilder(); 
    LineIterator it = IOUtils.lineIterator(new BufferedReader(new FileReader(filePath))); 
    int i = 0; 
    String line; 
     for (int lineNumber = 0; it.hasNext(); lineNumber++) { 
      line = (String) it.next(); 
      if (lineNumber == linecount) { 
       for (int j = 0; it.hasNext(); j++) { 
        extracted.append((String) it.next()); 
       } 
      } 
     } 
     return paragraphDetector.SentenceSplitter(extracted.toString()); 
    } 
+0

Qué clase de ** ParagraphDetector ** es esa. – mkl

+0

Después de encontrar una palabra específica en el archivo, detecta desde el punto inicial de la palabra hasta el final del párrafo. –

+1

No es parte de PDFBox ni en la API estándar de Java (¿o es una adición más reciente?). Por lo tanto, ¿de qué biblioteca es? – mkl

1
public static void main(String[] args) throws InvalidPasswordException, IOException { 
    File file = new File("File Path"); 
    PDDocument document = PDDocument.load(file);   
    PDFTextStripper pdfStripper = new PDFTextStripper(); 
    pdfStripper.setParagraphStart("/t"); 
    pdfStripper.setSortByPosition(true); 


    for (String line: pdfStripper.getText(document).split(pdfStripper.getParagraphStart())) 
      { 
       System.out.println(line); 
       System.out.println("********************************************************************"); 
      } 
} 

chicos intenta lo código de seguridad. Esto funciona con seguridad con PDFBox-2.0.8 Jar

+0

PDFBox incluye algunas heurísticas para adivinar el comienzo y el final del párrafo. Si uno quiere recuperar un párrafo comienza y termina con una tasa de error pequeña, usar un código como ese de hecho es el camino a seguir. Pero recuerde, esos son solo heurísticos, entonces habrá errores de vez en cuando ... – mkl

+0

Estoy de acuerdo contigo @mkl, es solo heurística. De hecho, estaba trabajando en el desarrollo de heurísticas avanzadas y técnicas ML para determinar encabezados, párrafos, tablas, pies de página, etc. (para nuestro propio PDFParser) pero para una solución de código abierto, la heurística PDFBox es la mejor – aavos

+0

De hecho bastante impresionante. – mkl

Cuestiones relacionadas