フリーソフトPopplerのpdftotextコマンドを利用するとPDF内のテキストを抽出することが出来ます。

PopplerとはPDFビューア(XpdfReader)やPDF解析・変換ツールのフリーソフトです。PopplerはXpdf(フリーソフト)をベースとして機能を拡張して提供されています。
ソースコードも提供されているライブラリとなります。コマンドライン実行のため、VBAや他プログラムからも利用可能となります。
| コマンド |
|---|
| pdftotext [options] <PDF-file> [<text-file>] |
| オプション | |
|---|---|
| 指定なし | PDF内のテキストを抽出します |
| -x <int> | 文字を取り出す位置・範囲を指定します(横位置) |
| -y <int> | 文字を取り出す位置・範囲を指定します(縦位置) |
| -W <int> | 文字を取り出す位置・範囲を指定します(幅) |
| -H <int> | 文字を取り出す位置・範囲を指定します(高さ) |
| -r <fp> | 文字を取り出す位置・範囲の解像度(DPI)を指定します(デフォルト:72dpi) |
| -layout | PDFの文字位置(レイアウト)を維持するします(極力維持します) |
| -fixed | PDFテキストの文字ピッチ(ポイント)を想定してレイアウトを組み立てる |
| -raw | 文字列をコンテンツストリームの順序で保持されます(ある程度、文字の順序性が担保される) |
| -nodiag | 斜めのテキスト(0度、90度、180度、270度の軸に近くないテキスト)を取込みしません |
| -htmlmeta | PDFから取り出したテキストをHTML形式にします |
| -tsv | ファイル内の各ブロック、行、単語の境界ボックス情報を含む TSV ファイルを生成します |
| -listenc | 利用可能なエンコーディングの一覧を表示します |
| -eol <string> | 改行コードを指定します |
| -nopgbrk | ページ間に改ページを挿入しません |
| -bbox | 各単語の境界ボックスとページサイズをhtmlに出力します |
| -bbox-layout | -bboxと同様ですが、レイアウト境界ボックスデータが追加されます |
| -cropbox | メディアボックスではなくクロップボックスを使用します |
| -colspacing <fp> | 隣接するテキストを新しい列と見なす前に、単語の後にどれだけのスペースを残すかを指定します |
| -enc <string> | 文字コードを指定します |
| -q | 変換時のメッセージ/エラーメッセージを非表示にします |
| -f <int> | 解析を行うPDFの開始ページを指定します |
| -l <int> | 解析を行うPDFの終了ページを指定します |
| -opw <string> | オーナーパスワード設定されている場合にパスワードを指定します |
| -upw <string> | ユーザーパスワード設定されている場合にパスワードを指定します |
| -v | バージョンとコピーライトを表示します |
| -h | コマンドの使用方法を表示します |
PDF内のテキストを抽出する。
>pdftotext Sample_text.pdf none/out_none.txt
>dir none
2,974 out_none.txt
>
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_none.txt (3KB)
|
文字を取り出す位置・範囲を指定する。
>pdftotext>pdftotext -x 100 -y 120 -W 200 -H 270 Sample_text.pdf x/out_xyWH.txt
>pdftotext>pdftotext -r 50 -x 100 -y 120 -W 200 -H 270 Sample_text.pdf x/out_xyWH_r50.txt
>pdftotext>pdftotext -r 100 -x 100 -y 120 -W 200 -H 270 Sample_text.pdf x/out_xyWH_r100.txt
>dir x
629 out_xyWH.txt
377 out_xyWH_r100.txt
947 out_xyWH_r50.txt
>
取り出す範囲は開始位置(x,y)と幅(W)と高さ(H)で指定します。
ただし、取り出す解像度(r)により位置は異なります。(r=4000までのDBI値)

| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_xyWH.txt (1KB)
out_xyWH_r50.txt (1KB)
out_xyWH_100.txt (1KB)
|
PDFの文字位置(レイアウト)を維持します。(極力維持します)
>pdftotext -layout Sample_text.pdf layout/out_layout.txt
>dir layout
4,335 out_layout.txt
>

| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_layout.txt (5KB)
|
PDFテキストの文字ピッチ(ポイント)を想定してレイアウトを組み立てる。
>pdftotext -fixed 12 Sample_text.pdf fixed/out_fixed12.txt
>pdftotext -fixed 6 Sample_text.pdf fixed/out_fixed6.txt
>dir fixed
4,219 out_fixed12.txt
5,204 out_fixed6.txt
>

| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_fixed6.txt (6KB)
out_fixed12.txt (5KB)
|
文字列をコンテンツストリームの順序で保持する。(ある程度、文字の順序性が担保される)
>pdftotext -raw Sample_text.pdf raw/out_raw.txt
>dir raw
2,828 out_raw.txt
>
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_raw.txt (3KB)
|
斜めのテキスト(0度、90度、180度、270度の軸に近くないテキスト)を取込みしません。背景斜めの透かしを取り込みしないときなどに便利です。
>pdftotext -nodiag watermark.pdf nodiag/out_nodiag.txt
>pdftotext watermark.pdf nodiag/out_nodiag_none.txt
>dir nodiag
55 out_nodiag.txt
132 out_nodiag_none.txt
>
サンプルでは何故か1行目のテキストも取り出し対象外となってしまいました。
| 元PDF | 抽出後テキスト |
|---|---|
| watermark.pdf (147KB) |
out_nodiag.txt (1KB)
out_nodiag_none.txt (1KB)
|
PDFから取り出したテキストをHTML形式にする。
>pdftotext -htmlmeta Sample_text.pdf htmlmeta/out_htmlmeta.html
>pdftotext -htmlmeta -fixed 10 Sample_text.pdf htmlmeta/out_htmlmeta_fixed.html
>dir htmlmeta
3,420 out_htmlmeta.html
4,835 out_htmlmeta_fixed.html
>
HTML形式で取り出す場合は「-fixed」などによりレイアウト維持した方が見やすくなる。
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_htmlmeta.html (4KB)
out_htmlmeta_fixed.html (5KB)
|
ファイル内の各ブロック、行、単語の境界ボックス情報を含む TSV ファイルを生成します。
テストの開始位置やテキスト内容などがあり、細かい解析には便利な情報となります。
>pdftotext -tsv Sample_text.pdf tsv/out_tsv.txt
>dir tsv
29,302 out_tsv.txt
>
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_tsv.txt (4KB)
|
>pdftotext -listenc Sample_text.pdf Available encodings are: . .. ASCII7 Big5 Big5ascii EUC-CN EUC-JP GBK ISO-2022-CN ISO-2022-JP ISO-2022-KR ISO-8859-6 ISO-8859-7 ISO-8859-8 ISO-8859-9 KOI8-R Latin1 Latin2 Shift-JIS Symbol TIS-620 UTF-16 UTF-8 Windows-1255 ZapfDingbats >
改行コードを指定します。
| unix | dos | mac |
|---|---|---|
| LF ( \n ) | CRLF ( \r\n ) | CR ( \r ) |
>pdftotext -eol unix Sample_text.pdf eol/out_eol_unix.txt
>pdftotext -eol dos Sample_text.pdf eol/out_eol_dos.txt
>pdftotext -eol mac Sample_text.pdf eol/out_eol_mac.txt
>dir eol
2,974 out_eol_dos.txt
2,764 out_eol_mac.txt
2,764 out_eol_unix.txt
>
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_eol_unix.txt (3KB)
out_eol_dos.txt (3KB)
out_eol_mac.txt (3KB)
|
>pdftotext -nopgbrk Sample_text.pdf nopgbrk/out_nopgbrk.txt
>dir nopgbrk
2,970 out_nopgbrk.txt
>
以下のように改ページ記号「CL」が出力されなくなります。

| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_nopgbrk.txt (3KB)
|
各単語の境界ボックスとページサイズをhtmlに出力します。
テキストの開始位置や終了位置を含むhtmlが出力されます。
>pdftotext -bbox Sample_text.pdf bbox/out_bbox.txt
>dir bbox
22,068 out_bbox.txt
>
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_bbox.txt (22KB)
|
-bboxと同様ですが、レイアウト境界ボックスデータが追加されます。
>pdftotext -bbox-layout Sample_text.pdf bbox-layout/out_bbox-layout.txt
>dir bbox-layout
50,866 out_bbox-layout.txt
>
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_bbox-layout.txt (50KB)
|
メディアボックスではなくクロップボックスを使用します。
>pdftotext -cropbox Sample_text.pdf cropbox/out_cropbox.txt
>dir bbox-layout
2,974 out_cropbox.txt
>
隣接するテキストを新しい列と見なす前に、単語の後にどれだけのスペースを残すかを指定します。フォントサイズに対する割合で測定されます。現在のデフォルトは0.7です。以前のリリースではデフォルトは0.3でした。
>pdftotext -colspacing 2 Sample_text.pdf colspacing/out_colspacing2.txt
>pdftotext -colspacing 0.3 Sample_text.pdf colspacing/out_colspacing0.3.txt
>dir sep
2,977 out_colspacing0.3.txt
2,904 out_colspacing2.txt
>
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_text.pdf (147KB) |
out_colspacing2.txt (3KB)
out_colspacing0.3.txt (3KB)
|
共通的に使用されるコマンドオプション「-f」「-l」「-enc」「-opw」「-upw」「-v」「-h」等のオプションは こちら でご確認ください。
テキスト全体を抽出すると、文字の配置(順序)が変わるケースが多く実用的とならない場合もあります。
以下のような部分抽出は有効に利用できることがあります。
(例)1つのPDFに複数の請求書(7ページ)が格納されている。
この中から宛先(下記赤枠)と合計金額(下記青枠)だけを抽出して一覧を作成する。
※3ページ目は意図的に位置を少しずらしています。

>rem /*--- 全文字を抽出(7ページ分) ---*/ >pdftotext Sample_select.pdf select/all.txt >rem /*--- 宛先のみ抽出(7ページ分) ---*/ >pdftotext -x 50 -y 110 -W 200 -H 16 -nopgbrk Sample_select.pdf select/name.txt >rem /*--- 金額のみ抽出(7ページ分) ---*/ >pdftotext -x 120 -y 270 -W 130 -H 16 -nopgbrk Sample_select.pdf select/price.txt
>rem /*--- 宛先抽出の結果 ---*/
>type select\name.txt
ABC株式会社
ABC株式会社
ABC株式会社
ABC株式会社
株式会社XXX商事
有限会社YYY
有限会社YYY
>rem /*--- 金額抽出の結果 ---*/
>type select\price.txt
234,850
96,800
181,610
39,550
97,768
484,000
173,250
| 元PDF | 抽出後テキスト |
|---|---|
| Sample_select.pdf (40KB) |
all.txt (5KB)
name.txt (1KB)
price.txt (1KB)
|
Windows版を使用しています。
pdftotext version 24.08.0 Copyright 2005-2024 The Poppler Developers - http://poppler.freedesktop.org Copyright 1996-2011, 2022 Glyph & Cog, LLC Usage: pdftotext [options] <PDF-file> [<text-file>] -f <int> : first page to convert -l <int> : last page to convert -r <fp> : resolution, in DPI (default is 72) -x <int> : x-coordinate of the crop area top left corner -y <int> : y-coordinate of the crop area top left corner -W <int> : width of crop area in pixels (default is 0) -H <int> : height of crop area in pixels (default is 0) -layout : maintain original physical layout -fixed <fp> : assume fixed-pitch (or tabular) text -raw : keep strings in content stream order -nodiag : discard diagonal text -htmlmeta : generate a simple HTML file, including the meta information -tsv : generate a simple TSV file, including the meta information for bounding boxes -enc <string> : output text encoding name -listenc : list available encodings -eol <string> : output end-of-line convention (unix, dos, or mac) -nopgbrk : don't insert page breaks between pages -bbox : output bounding box for each word and page size to html. Sets -htmlmeta -bbox-layout : like -bbox but with extra layout bounding box data. Sets -htmlmeta -cropbox : use the crop box rather than media box -colspacing <fp> : how much spacing we allow after a word before considering adjacent text to be a new column, as a fraction of the font size (default is 0.7, old releases had a 0.3 default) -opw <string> : owner password (for encrypted files) -upw <string> : user password (for encrypted files) -q : don't print any messages or errors -v : print copyright and version info -h : print usage information -help : print usage information --help : print usage information -? : print usage information
| 主な機能 | 概要 |
|---|---|
| pdfattach | PDFファイルに添付ファイルを埋め込みします |
| pdfdetach | PDF内に添付(埋め込み)されているファイルの一覧表示や抽出を行います |
| pdffonts | PDFファイルで使用されているフォントやフォントの埋め込み有無を調べる |
| pdfimages | PDFファイルで使用(埋め込み)されている画像を抽出する |
| pdfinfo | PDFファイルの情報(作成者、作成日時、ページ数など)を表示する |
| pdfseparate | PDFファイルを1ページごとに分割する |
| pdftocairo | PDFファイルを画像に変換する(Cairoベクターグラフィックスを使用) |
| pdftohtml | PDFをHTML形式に変換する |
| pdftoppm | PDFファイルを画像に変換する |
| pdftops | PDFファイルをPostScriptファイルに変換する |
| pdfunite | 複数のPDFファイルをページ結合する |