Question

Je suis en train de faire mon chemin à travers Poppler et sa documentation (manque de).

Ce que je veux faire est une chose très simple: ouvrir un fichier PDF et lire le texte en elle. Je vais ensuite traiter le texte, mais cela ne compte pas vraiment ici.

Alors ... j'ai vu la fonction poppler_page_get_text, et ce genre de travaux, mais je dois spécifier un rectangle de sélection, ce qui est très pratique. N'y at-il seulement une fonction très simple qui génèrerait le texte PDF pour (peut-être ligne par ligne?).

Était-ce utile?

La solution

Vous devriez être en mesure de définir le rectangle de sélection à l'pageSize/MediaBox de la page et d'obtenir tout le texte.

Je dis devriez parce que, avant de commencer à se demander pourquoi vous êtes surpris par la sortie de poppler_page_get_text, vous devez être conscient de la façon dont le texte se pose sur une page. Tous les graphiques sont disposés sur une page en utilisant un programme exprimé en notation post-fix. Pour rendre la page, ce programme est exécuté sur une page vierge.

Les opérations dans le programme peut comprendre, en modifiant les couleurs, la position, la matrice de transformation de courant, les lignes de dessin, des courbes de Bézier et ainsi de suite. Le texte est mis par une série d'opérateurs de texte qui sont toujours encadrés par BT (Début du texte) et ET (texte final). Comment sur une page ou lorsque le texte est placé est à la seule discrétion du logiciel qui génère le PDF. Par exemple, pour les pilotes d'impression, le code répond à GDI appelle à DrawString et qui se traduit par des opérations dans le dessin de texte.

Si vous êtes chanceux, le texte sur la page est mis dans un ordre sain d'esprit avec l'utilisation de la police saine d'esprit, mais de nombreux programmes qui génèrent des PDF ne sont pas si bon. Psroff, par exemple aimé placer tout le texte brut, puis le texte en italique, le texte en gras. Les mots peuvent ou ne peuvent pas être placés dans l'ordre de lecture. Les polices peuvent être recodé afin que 'a' cartes à '{' ou autre. Ensuite, vous pourriez avoir ligatures où plusieurs personnages sont remplacés par un seul Glyphes -. Les plus courantes sont ae, oe, fi, fl et ffl

Avec tout cela en place, le processus de l'extraction de texte est décidément non trivial, alors ne soyez pas surpris si vous voyez des résultats médiocres de la qualité de l'extraction de texte.

Je travaillais sur les outils d'extraction de texte dans Acrobat 1.0 et 2.0 - c'est un véritable défi pour obtenir le droit

.

Autres conseils

Juste pour les disques, je me sers poppler en ce moment avec ce petit programme

#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

Je suis tout à fait heureux avec e résultat à ce jour, à l'exception des tableaux et la restitution « tableur » dans le texte pur, où parfois une seule cellule peut couvrir par plusieurs lignes. (Si quelqu'un sait comment éviter cela?)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top