Estoy tratando de hacer mi camino a través de Poppler y su (falta de) la documentación.

Lo que yo quiero hacer es una cosa muy simple: abrir un archivo PDF, y leer el texto en ella. Estoy pasando luego a procesar el texto, pero que en realidad no importa aquí.

Así que… vi la poppler_page_get_text función y el tipo de obras, pero tengo que especificar un rectángulo de selección, que no es muy práctico. No hay sólo una función muy sencilla que daría como resultado el texto de un PDF en orden (quizá línea por línea?).

  • El poppler código fuente incluye dos sencillos programas de ejemplo en ./cpp/tests que ilustran toda la funcionalidad.
InformationsquelleAutor nico | 2010-04-28

2 Comentarios

  1. 9

    Usted debe ser capaz de establecer el rectángulo de selección para la pageSize/MediaBox de la página y todo el texto.

    Digo debería porque antes de empezar a preguntarse por qué usted consigue sorprendido por la salida de poppler_page_get_text, usted debe ser consciente de cómo el texto se sentó en una página. Todos los gráficos se colocan en una página utilizando un programa expresado en el post-revisión de la notación. Para mostrar la página, este programa se ejecuta en una página en blanco.

    Operaciones en el programa puede incluir, cambiando los colores, la posición actual de la matriz de transformación, dibujar líneas, curvas de bezier y así sucesivamente. El texto es presentado por una serie de operadores de texto que están siempre encerradas por BT (comienza el texto) y ET (final del texto). Cómo o donde el texto se coloca en una página es a la sola discreción del software que genera el PDF. Por ejemplo, para los controladores de impresión, el código responde a las llamadas GDI para DrawString y se traduce en que en el texto de las operaciones de dibujo.

    Si tienes suerte, el texto de la página se presenta en un buen fin de cuerdo con el uso de fuentes, pero muchos de los programas que generan PDF no son tan amables. Psroff, por ejemplo gustó a colocar todo el texto sin formato en primer lugar, a continuación, el texto en cursiva, a continuación, el texto en negrita. Las palabras pueden o no pueden ser colocados en el orden de lectura. Las fuentes pueden ser re-codificados de modo que 'a' mapas para '{' o lo que sea. Entonces usted podría tener ligaduras donde varios personajes se sustituyen por una sola glifos – los más comunes son ae, oe, fi, fl, y ffl.

    Con todo este en su lugar, el proceso de extracción de texto es decididamente no-trivial, así que no se sorprenda si usted ve mala la calidad de los resultados de la extracción del texto.

    Yo solía trabajar en la extracción de texto herramientas de Acrobat 1.0 y 2.0 – es un verdadero reto para obtener el derecho.

    • Muchísimas gracias por la explicación. Creo que voy a empezar a leer un poco más extensamente acerca de cómo el PDF se codifica entonces. O intentar replantear mi estrategia un poco… 🙂 Saludos nico
  2. 4

    Sólo para los registros, estoy usando poppler ahora con este pequeño programa

    #include <iostream>
    
    #include "poppler-document.h"
    #include "poppler-page.h"
    using namespace std;
    
    int main()
    {
        poppler::document *doc = poppler::document::load_from_file("./CMI2APIDocV1.4.pdf");
        const int pagesNbr = doc->pages();
        cout << "page count: " << pagesNbr << endl;
    
        for (int i = 0; i < pagesNbr; ++i)
            cout << doc->create_page(i)->text().to_latin1().c_str() << endl;
    }
    
    //g++ -I/usr/include/poppler/cpp/-c poppler.cpp
    //g++ -I/usr/include/poppler/cpp poppler.o  /usr/lib/x86_64-linux-gnu/libpoppler-cpp.a /usr/lib/x86_64-linux-gnu/libpoppler.a /usr/lib/x86_64-linux-gnu/liblcms2.so     /usr/lib/x86_64-linux-gnu/libfontconfig.a /usr/lib/x86_64-linux-gnu/libjpeg.a /usr/lib/x86_64-linux-gnu/libfreetype.a     /usr/lib/x86_64-linux-gnu/libexpat.a /usr/lib/x86_64-linux-gnu/libz.a

    Estoy bastante contento con el resultado, hasta ahora, excepto para las matrices y «hoja de cálculo» en la restitución de texto puro, donde en algún momento una sola célula puede abarcar a través de múltiples líneas. (si alguien sabe como evitar eso ?)

Dejar respuesta

Please enter your comment!
Please enter your name here