3

私はPopplerとその(不足している)ドキュメントを理解しようとしています。

私がやりたいのは非常に単純なことです。PDFファイルを開いてその中のテキストを読みます。次に、テキストを処理しますが、ここではそれほど重要ではありません。

だから...私はpoppler_page_get_text関数を見ました、そしてそれは一種の働きをします、しかし私は選択長方形を指定しなければなりません、それはあまり便利ではありません。PDFテキストを順番に(おそらく1行ずつ)出力する非常に単純な関数はありませんか?

4

2 に答える 2

9

pageSize/MediaBox選択長方形をページのに設定して、すべてのテキストを取得できるはずです。

の出力に驚かされる理由を疑問に思う前にpoppler_page_get_text、テキストがページにどのように配置されるかを知っておく必要があるためです。すべてのグラフィックは、修正後の表記で表現されたプログラムを使用してページに配置されます。ページをレンダリングするために、このプログラムは空白のページで実行されます。

プログラムの操作には、色の変更、位置、現在の変換行列、線の描画、ベジェ曲線などが含まれます。テキストは、常にBT(開始テキスト)とET(終了テキスト)で囲まれた一連のテキスト演算子によってレイアウトされます。テキストをページに配置する方法または場所は、PDFを生成するソフトウェアの独自の裁量に委ねられています。たとえば、印刷ドライバーの場合、コードはGDI呼び出しに応答し、DrawStringそれをテキスト描画操作に変換します。

運が良ければ、ページ上のテキストは適切なフォントの使用法で適切な順序で配置されますが、PDFを生成する多くのプログラムはそれほど親切ではありません。 Psroffたとえば、最初にすべてのプレーンテキスト、次にイタリックテキスト、次に太字テキストを配置するのが好きでした。単語は読み順で配置される場合と配置されない場合があります。'a'フォントは、マップなどにマップするように再エンコードできます'{'。次に、複数の文字が単一のグリフに置き換えられた合字がある場合があります。最も一般的な文字aeoe、、、、、、fiおよびflですffl

これらすべてが整っているので、テキストを抽出するプロセスは明らかに重要です。したがって、テキスト抽出の結果の品質が低くても驚かないでください。

私は以前、Acrobat1.0および2.0のテキスト抽出ツールに取り組んでいました。正しく理解するのは非常に困難です。

于 2010-04-29T19:13:09.307 に答える
5

記録のために、私は今この小さなプログラムでpopplerを使用しています

#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

これまでの結果には非常に満足しています。ただし、純粋なテキストでの配列と「スプレッドシート」の復元では、1つのセルが複数の行にまたがる場合があります。(誰かがそれを回避する方法を知っている場合?)

于 2013-11-04T09:36:12.490 に答える