45

Ghostscript を使用して PDF の一部 (座標を使用) からテキストを抽出したいと思います。

誰でも私を助けることができますか?

4

3 に答える 3

106

はい、Ghostscript を使用すると、PDF からテキストを抽出できます。しかし、いいえ、それは仕事に最適なツールではありません. いいえ、「部分」(単一ページの一部)で行うことはできません。できること: 特定の範囲のページのテキストのみを抽出します。

最初: Ghostscript の txtwrite出力デバイス (あまり良くない)

 gs \
   -dBATCH \
   -dNOPAUSE \
   -sDEVICE=txtwrite \
   -dFirstPage=3 \
   -dLastPage=5 \
   -sOutputFile=- \
   /path/to/your/pdf

これにより、3 ~ 5 ページに含まれるすべてのテキストが stdout に出力されます。テキストファイルに出力したい場合は、

   -sOutputFile=textfilename.txt

gsアップデート:

Ghostscript の最近のバージョンでは、txtwriteデバイスが大幅に改善され、バグが修正されています。詳細については、最近の Ghostscript の変更ログ(そのページでtxtwriteを検索) を参照してください。


2 番目: Ghostscript のps2ascii.psPostScript ユーティリティ(改善)

これには、ファイルps2ascii.psの最新バージョンをGhostscript Git ソース コード リポジトリからダウンロードする必要があります。PDF を PostScript に変換してから、PS ファイルに対して次のコマンドを実行する必要があります。

gs \
  -q \
  -dNODISPLAY \
  -P- \
  -dSAFER \
  -dDELAYBIND \
  -dWRITESYSTEMDICT \
  -dSIMPLE \
   /path/to/ps2ascii.ps \
   input.ps \
  -c quit

パラメータが定義されていない場合-dSIMPLE、各出力行には、使用されているフォントとフォント サイズに関する純粋なテキスト コンテンツ以外の追加情報が含まれます。

そのパラメーターを に置き換えると、使用され-dCOMPLEXている色と画像に関する追加情報が得られます。

このユーティリティの詳細については、 ps2ascii.ps内のコメントを参照してください。使い心地は良くありませんが、私にとっては必要なほとんどの場合に機能しました....

3 番目: XPDF の pdftotextCLI ユーティリティ (Ghostscript より快適)

テキスト抽出を行うより快適な方法: を使用しますpdftotext(Windows だけでなく、Linux/Unix または Mac OS X でも使用できます)。このユーティリティは、Poppler または XPDF に基づいています。これはあなたが試すことができるコマンドです:

 pdftotext \
   -f 13 \
   -l 17 \
   -layout \
   -opw supersecret \
   -upw secret \
   -eol unix \
   -nopgbrk \
   /path/to/your/pdf
   - |less

これにより、ページ範囲 13 (最初のページ) から 17 (最初のページ) が表示され、二重パスワードで保護された名前付き PDF ファイルのレイアウトが保持されます (ユーザーと所有者のパスワードsecretおよびsupersecret を使用)。 PDFページ間に改ページを挿入し、lessを介してパイプします...

pdftotext -h利用可能なすべてのコマンドライン オプションを表示します。

もちろん、どちらのツールも PDF のテキスト部分 (存在する場合) に対してのみ機能します。ああ、数式もうまく機能しません... ;-)


pdftotextアップデート:

Popplerの最近のバージョンには、OPが要求したように、「PDFの一部(座標を使用)」pdftotextページを抽出するオプションがあります。パラメータは次のとおりです。

  • -x <int>: トリミング領域の左上隅の x 座標
  • -y <int>: トリミング領域の左上隅の y 座標
  • -W <int>: トリミング領域の幅 (ピクセル単位) (デフォルトは 0)
  • -H <int>: トリミング領域の高さ (ピクセル単位) (デフォルトは 0)

-layoutパラメーターと一緒に使用する場合に最適です。


4: MuPDF のmutool drawコマンドはテキストを抽出することもできます

クロスプラットフォームのオープン ソースMuPDFアプリケーション (Ghostscript も開発している同じ会社によって作成された) には、コマンド ライン ツールmutool. このツールを使用して PDF からテキストを抽出するには、次を使用します。

mutool draw -F txt the.pdf

抽出されたテキストを に出力し<stdout>ます。-o filename.txtファイルに書き込む場合に使用します。

5 番目: PDFLib のテキスト抽出ツールキット (TET) (何よりも優れていますが、これは PayWare です)

pdflib製品ファミリのテキスト抽出ツールキットであるTETは、PDF ファイル内のテキスト コンテンツの xy 座標 (およびその他の多く) を見つけることができます。TET にはコマンドライン インターフェイスがあり、私が知っているすべてのテキスト抽出ツールの中で最も強力です。(合字も処理できます...) 彼らのウェブサイトからの引用:

ジオメトリ
TET は、ページ上の位置、グリフの幅、テキストの方向など、テキストの正確な測定基準を提供します。ページ上の特定の領域を除外したり、テキスト抽出に含めたりすることができます。たとえば、ヘッダーとフッターまたは余白を無視します。

私の経験では、想像できる最も単純な CLI インターフェイスを備えているわけではありません。


さらに多くのオプションがあります。

  1. podofotxtextract(CLI ツール) PoDoFo プロジェクトから (オープン ソース)
  2. calibre(通常、電子書籍、オープン ソースを処理する GUI プログラム) には、PDF からテキストを抽出できるコマンドライン オプションがあります。
  3. AbiWord(GUI ワード プロセッサ、オープン ソース) は、PDF をインポートして、そのファイルを .txt として保存できます。abiword --to=txt --to-name=output.txt input.pdf
于 2011-05-31T14:55:18.733 に答える
1

GhostScript が座標を受け入れることができるかどうかはわかりませんが、PDF を画像に変換し、指定された座標からトリミングされたサブ画像として、または座標と共に画像全体として OCR エンジンに送信できます。一部の OCR API は、OCR の領域を狭めるために四角形パラメーターを受け入れます。

Tesseractを OCR エンジンとして使用し、GhostScript を PDF から画像へのコンバーターとして使用する実例については、VietOCRを参照してください。

于 2011-09-03T15:34:56.813 に答える
1

Debenu Quick PDF Libraryは、ページ上の定義された領域からテキストを抽出できます。SetTextExtractionArea関数を使用すると、x 座標と y 座標を指定でき、領域の幅と高さも指定できます。

  • Left = 領域の左端の水平座標
  • Top = 領域の上端の垂直座標
  • = 領域の幅
  • 高さ= エリアの高さ

次に、この直後にGetPageText関数を呼び出して、定義された領域からテキストを抽出できます。

C# を使用した例を次に示します (ただし、ライブラリはマルチプラットフォームであり、さまざまなプログラミング言語で使用できます)。

DPL.LoadFromFile(@"Sample.pdf", "");
DPL.SetOrigin(1); // Sets 0,0 coordinate position to top left of page, default is bottom left
DPL.SetTextExtractionArea(35, 35, 229, 30); // Left, Top, Width, Height
string ExtractedContent = DPL.GetPageText(8);
Console.WriteLine(ExtractedContent);

GetPageText を使用すると、その領域にあるテキスト、またはその領域にあるテキストだけでなく、名前、色、サイズなどのテキストのフォントに関する情報も返すことができます。

于 2015-08-05T13:51:57.813 に答える