Domanda

Sto cercando di ottenere la mia strada attraverso Poppler e la sua (mancanza di) documentazione.

Quello che voglio fare è una cosa molto semplice: aprire un file PDF e leggere il testo in esso. Sto andando poi a elaborare il testo, ma che in realtà non importa qui.

Quindi ... ho visto la funzione poppler_page_get_text, e che tipo di opere, ma devo specificare un rettangolo di selezione, che non è molto utile. Non c'è solo una funzione molto semplice che avrebbe generato il testo in formato PDF in modo (forse riga per riga?).

È stato utile?

Soluzione

Si dovrebbe essere in grado di impostare il rettangolo di selezione al pageSize/MediaBox della pagina e ottenere tutto il testo.

Dico dovrebbe perché prima di iniziare a chiedersi perché si ottiene sorpresi dalla uscita del poppler_page_get_text, si dovrebbe essere consapevoli di come il testo viene steso su una pagina. Tutte le grafiche sono disposte su una pagina utilizzando un programma espressa in post-fix notazione. Per il rendering della pagina, questo programma viene eseguito su una pagina vuota.

Operazioni del programma può includere, colori cangianti, posizione, matrice di trasformazione corrente, linee di disegno, curve di Bezier e così via. Il testo è disposto da una serie di operatori di testo che sono sempre tra parentesi da BT (inizio testo) e ET (testo finale). Come e in cui il testo viene inserito in una pagina è a sola discrezione del software che genera il PDF. Ad esempio, per i driver di stampa, il codice risponde alle chiamate GDI per DrawString e traduce che nelle operazioni di disegno di testo.

Se si è fortunati, il testo sulla pagina è disposto in un ordine sano con l'utilizzo di font sana di mente, ma molti programmi che generano PDF non sono così gentili. Psroff, per esempio voluto mettere tutto il testo in chiaro prima, poi il testo in corsivo, il testo in grassetto. Le parole possono o non possono essere messi in ordine di lettura. Font possono essere ri-codificato in modo che le mappe 'a' a '{' o qualsiasi altra cosa. Allora si potrebbe avere legature in cui più personaggi sono sostituiti da singoli glifi -. I più comuni sono ae, oe, fi, fl, e ffl

Con tutto questo in luogo, il processo di estrazione di testo è decisamente non banale, quindi non stupitevi se vedete i risultati di scarsa qualità da estrazione di testo.

Ho usato per lavorare sugli strumenti di estrazione del testo in Acrobat 1.0 e 2.0 - si tratta di una vera e propria sfida per ottenere destra

.

Altri suggerimenti

Solo per i record, sto usando poppler in questo momento con questo piccolo programma

#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

Sono abbastanza soddisfatto esimo risultato finora, fatta eccezione per gli array e restituzione "foglio di calcolo" nel testo puro, in cui a volte una singola cellula può estendersi attraverso più righe. (Se qualcuno sa come evitare che?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top