TOP > Poppler ツール
概要
Poppler とはPDF ドキュメントの閲覧等に用いられるフリーのツール群です。Poppler はXpdf をベースとして機能アップ、表示の効率化、 多種多様な機能を提供する目的で作成されました。
注記:効率化は誇張でした。一部は多機能故に逆に速度低下が出てます。
詳細
- ライセンスはGPL(フリー)
- 機能別にEXEファイルが存在
- 日本語(2バイト文字列)対応(言語ファイルより
- Acrobatアプリ本体がなくても動作 (当たり前
- ドキュメントも公式サイトも全て英語 (汗
- コマンドラインのツールなのでVBAなどのプログラムから制御可能
- Windows版だけでなく、Linux、Mac 版など多様なOSに対応
- 他の多数のソフトで機能の一部が利用されている
- 現在もバージョンアップが繰り返されている
- 残念なことに公式サイトではソースのみの公開で、OS単位のバイナリーは配布されてない。
ダウンロード
先にも書きましたが Poppler 公式サイトはソースのみでバイナリーは公開してません。Windows 版のEXEのバイナリーは以下からダウンロード出来ます。(2022/09/15 時点)
Version 22.04.0-0
File:Release-22.04.0-0.zip
コチラが最新です。
Poppler for WindowsVersion 0.68.0
File : poppler-0.68.0_x86.7zpoppler-qt5 for mingw32Version 0.32.0
file : poppler-0.32.0-mingw32-1.zip
sise : 7.76MB
インストール
上記で紹介したファイルは2つとも解凍するだけです。解凍先は出来ればWindows の環境変数の Path を通した方がいいです。通さないならば半角の空白が無いフォルダに置くことをオススメします。その方がイロイロとトラブルが少なく済みます。
言語ファイルのダウンロード
ココのサイトを開きます。そして「Poppler Encoding Data」と書かれている下に有る「poppler-data-0.4.9.tar.gz」の部分をクリックします。poppler-data-0.4.9.tar.gz ファイルがダウンロードできます。
※上記画像は旧バージョン 0.4.8 です。0.4.9 が最新です。
言語ファイルのインストール
① ダウンロードした poppler-data-0.4.9.tar.gz ファイルを解凍すると poppler-data-0.4.9 フォルダが有ります。それをpoppler にリネームします。
② Poppler の各EXE 実行フォルダbin と同じ階層に share フォルダがあります。その share フォルダの下に①のpoppler フォルダごと、そのままコピーします。
③ pdfinfo.exe で言語ファイルのテストをします。
>pdfinfo.exe -listenc
以下の様に表示されたらOKです。
001 >pdfinfo -listenc
002 Available encodings are:
003 .
004 ..
005 ASCII7
006 Big5
007 Big5ascii
008 EUC-CN
009 EUC-JP
010 GBK
011 ISO-2022-CN
012 ISO-2022-JP
013 ISO-2022-KR
014 ISO-8859-6
015 ISO-8859-7
016 ISO-8859-8
017 ISO-8859-9
018 KOI8-R
019 Latin1
020 Latin2
021 Shift-JIS
022 Symbol
023 TIS-620
024 UTF-16
025 UTF-8
026 Windows-1255
027 ZapfDingbats
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
注)poppler-data-0.4.9.tar.gz は旧バージョン 0.4.8 と表示が少し異なります。
機能
Windows 版でExe 単位での機能です。
- pdfdetach.exe :PDFから添付ファイルの抽出、情報の表示
- pdffonts.exe :PDFのフォント情報を表示 ※注意有り
- pdfimages.exe :PDFから画像を抽出
- pdfinfo.exe :PDFの文書のプロパティと各ページ情報などを表示
- pdfseparate.exe :PDFから単一のページを抽出
- pdftocairo.exe :PDFを画像形式に変換
- pdftohtml.exe :PDFをHTML形式に変換
- pdftoppm.exe :PDFをPPM画像形式に変換
- pdftops.exe :PDFをPostScriptファイルに変換
- pdftotext.exe :PDFからテキストを抽出
- pdfunite.exe :PDFのマージ
「表示」と書いている部分はDOSの標準出力としてテキスト出力に切り替える事も出来ます。
例:pdfinfo.exe -meta in.pdf > out.txt
機能別の使い方
- Pdfdetach の使い方
- Pdffonts の使い方
- Pdfinfo の使い方
- Pdfimages の使い方
- Pdfseparate の使い方
- pdftocairo の使い方
- pdftohtml の使い方
- pdftoppm の使い方
- pdftops の使い方
- Pdftotext の使い方
- pdfunite の使い方
Poppler を使用したVBA関数
Poppler を起動するサンプル
上記以外の処理をPoppler でさせるサンプルです。オプション等の設定、エラーの判定は全て自分で行う必要が有ります。
コマンドラインを実行する部分にはVBA関数「 RunCommandLineEX 」をご使用ください。
例:
001 ' コマンドラインを起動するメイン・デモ
002
003 Sub Main_Demo()
004
005 Dim i As Long
006 Dim bRet As Boolean
007 Dim strOutFile1() As String
008 Dim strOutFile2() As String
009
010 '引数で使う変数
011 Dim strCmd As String
012 Dim strOutFile(1) As String
013 Dim strErr As String
014 Dim strWorkFolder As String
015 Dim lRetCode As Long
016 Dim lErrCount As Long
017 Dim lErrCode(4) As Long
018
019 gDebugMode = True '実運用ではFalse
020
021 'Poppler 終了コードのセット
022 lErrCode(0) = 0 'No error.
023 lErrCode(1) = 1 'Error opening a PDF file.
024 'I/O Error: Couldn't open file 'XX.pdf': No error.
025 lErrCode(2) = 2 'Error opening an output file.
026 'I/O Error: Couldn't open text file 'xx.txt'
027 lErrCode(3) = 3 'Error related to PDF permissions.
028 lErrCode(4) = 99 'Other error.
029 lErrCount = 4 'Ubound(lErrCode)
030 strCmd = "I:¥Tools¥Run¥Poppler-0.45¥bin¥pdftotext.exe " & _
031 "-layout " & _
032 "I:¥Tools¥Run¥Poppler-0.45¥bin¥IN.pdf -f 9 -l 9 OUT.pdf"
033
034 'コマンドラインの実行
035 bRet = RunCommandLineEX(strCmd, strWorkFolder, _
036 lErrCount, lErrCode, _
037 strOutFile, strErr, lRetCode)
038
039 If gDebugMode Then
040 '実行結果の表示
041 Debug.Print "bRet=" & bRet
042 Debug.Print "lRetCode=" & lRetCode
043 strOutFile1 = Split(strOutFile(0), vbCrLf)
044 strOutFile2 = Split(strOutFile(1), vbCrLf)
045 Debug.Print "strErr=" & strErr
046 For i = 0 To UBound(strOutFile1)
047 Debug.Print "msg1 i(" & i & ")="; strOutFile1(i)
048 Next i
049 For i = 0 To UBound(strOutFile2)
050 Debug.Print "msg2 i(" & i & ")="; strOutFile2(i)
051 Next i
052 End If
053 MsgBox "End " & Now
054 End Sub
055
056 Public Function RunCommandLineEX( _
057 ・・・・) As Boolean
058
059 'ココはVBA関数「 RunCommandLineEX 」をご使用ください。
060 '
061 End Function
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
日本語の扱い
- VBA関数「 RunCommandLineEX 」は標準出力のUTF-8を変換してプログラム内に読み込む機能が入っています。よってオプション「-enc Shift-JIS 」は必要としません。これにより日本語の文字化けを避けることができます。
- pdfinfo で結果をDos 画面に表示すると日本語の2バイト文字は化けて表示されます。但し、リダイレクト(標準出力)で出力したテキストを文字コードで自動判別出来るエディタならば日本語が正しく表示できます。でもエディタによっては表示できる出来ない場合も有ります。メモ帳はダメでした。
※メモ帳で表示てきたのは「CreationDate: 」と「ModDate:」の「東京 (標準時)」部分だけです。
- pdfinfo のテキスト出力はUTF-8Nで出力してますが。一部はUNICODEになっている感じです。
- 「pdftotext -enc Shift-JIS ・・・」で日本語の文字表示が可能ですが、半角文字まで2バイト文字になってしまう問題が有ります。よってこの「-enc Shift-JIS 」オプションは使用せずに、VBA関数「 RunCommandLineEX 」で内部コード変換させてください。
pdffonts.exe の使用について
バージョン0.45 の pdffonts.exe は アンチウイルスソフト(Avast) で脅威が検出され実行できません。Windows にとって好ましくない動作をおこなうみたいでアンチウイルスソフトで隔離されてしまいます。これも含め問題点をまとめてみました。
- バージョン0.45 ではアンチウイルスソフトで脅威が検出され実行できない。
- バージョン0.32 の pdffonts.exe はアンチウイルスソフトで脅威が検出されず実行はできる。
以上から現時点(2016/6/29)で問題無く使えそうなのは「Xpdf 3.04 の pdffonts.exe 」だけとなります。「Xpdf 3.04 の pdffonts.exe 」は2年前のソフトですが、PDFファイルの仕様そのもののバージョンは上がってないので使用に問題が出るとは考えにくいです。
001 I:¥Tools¥Run¥Xpdf¥bin32>pdffonts in1.pdf
002 Config Error: No display font for 'Symbol'
003 Config Error: No display font for 'ZapfDingbats'
004 name type emb sub uni object ID
005 ------------------------------------ ----------------- --- --- --- ---------
006 Helvetica Type 1 no no no 151 0
007 BSBASK+MS-Gothic-H CID TrueType yes yes no 158 0
008 Helvetica-Oblique Type 1 no no no 96 0
009 MMJRJM+rtcxss Type 1C yes yes no 104 0
010 KJXKQP+rtxmi Type 1C yes yes no 111 0
011 OTNCWA+txsya Type 1C yes yes yes 112 0
012 HYZHPX+t1xtt Type 1C yes yes no 113 0
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
備考
- Poppler の言語ファイルは Xpdf と異なり固定フォルダを見るように設計されています。それならばPopplerのバイナリー配布と同時にそのフォルダも入れるようにしてくれると有難いです。
< TOPへ戻る >
管理人さん、はじめまして。
川端といいます。
どうしてもわからない事があり、質問させていただきます。
やりたいこと…pdfのテキストに対して、あるフォントが使われている場合、その文字にハイライトを付けるようにしたいです。
フォントで検索は可能なのでしょうか?
また、PDFで使用している全フォント一覧を取得することはできるのでしょうか?PDDocのGetInfoでpdfのプロパティ情報が取得できるようですが、プロパティ情報のフォントタブに表示される「この文書で使用しているフォント」を取得したいです。
(その一覧から一つのフォントを選択して、ハイライトを付けるようにできればいいなと思っています)
よろしくおねがいします!
OS:Windows10Pro
Adobe Acrobat Pro DC:2020.006.20042
Excel:Office Personal 2019
川端さん はじめまして。
分かる範囲で返答させていただきます。
>やりたいこと…pdfのテキストに・・、・・フォントが・・その文字にハイライトを・・。
>フォントで検索は可能なのでしょうか?
コチラのサイトから現状での答えは「可能ではない」です。
メーカーの機能を判断する為の目安になる公開マニュアルも再度見てみましたが、それらしき記述は見当たりません。
>また、PDFで使用している全フォント一覧を取得することはできるのでしょうか?
AcrobatのOLEにはズバリと言えるその機能は有りません。
しかし、Popperのpdffonts.exeを使えば可能です。
>pdffonts ABC.pdf > list.txt
CPDFでも出来ます。
>cpdf -list-fonts ABC.pdf > list.txt
実際に動かして結果を確認して下さい。
Xpdfのpdffonts.exeも未確認ですが可能と思っています。Xpdfのソースを元にPopperが出来ているからです。
共にコマンドラインなのでプログラムからも起動できますし、結果も標準出力「> list.txt」で、これもプログラムから見ることが出来ます。
ハイライト表示についてですが。
コチラでやり方を公開していますが、現在は問題点が見つかっています。修正版が出るにはまだ2週間ぐらいは掛かるかもしれません。解決方法がネット上には無く、全てを自力でやっています。手持ちの500個程のPDFを調査し、動作確認しながらの作業になるので、時間がかかっています。
>フォントで検索は可能なのでしょうか?
最初の質問に戻ります。今は「可能ではない」ですが、逃げ道がないかと探してみました。
PDFを一旦HTMLファイルとして出力します。HTMLはテキストなのでプログラムから読み込めます。HTMLを見ると、該当するテキストがどのフォントを使っているか分かります。
問題点
1)ページ番号が分からない
HTMLにはページという概念が無いためです。事前にPDF上にページ番号と読み取れる情報を付けとくなどの処理が必要かもしれません。考えてみるともっと簡単な方法も有るはずです。
「ページ番号」と「テキスト」が分れば、(修正版が出た後の)コチラの情報でハイライト表示が可能になるかもしれません。(現状では「かも」です。
▼現在調査中のコチラの問題とやや似ている部分が有るので、川端さんの逃げ道がないか、この後でもう少し調査します。結果はコチラのコメントに追加します。
▼念の為に海外のサイトを見てみました。検索キーは「How to programmatically get used font name from text on PDF」です。
・下記にiTextSharpを使った例が出ています。
https://stackoverflow.com/questions/6882098/how-can-i-get-text-formatting-with-itextsharp
・海外の有償ソフトでテキストのフォントを取得するのも有るみたいです。
https://www.debenu.com/products/development/debenu-pdf-library/features/pdf-content-extraction/
海外のサイトを見ると川端さんと同じ疑問を持った人がいました。
川端さんへ
調査した結果です。
結論 -> ある程度は出来ます。
手順:
1)Popperのpdftohtml.exeでPDFをXML変換してファイル出力
例:
>pdftohtml -c -i -xml -fontfullname "X:\output\AA.pdf"
2)上記の AA.xml ファイルをプログラムから読み込む。
AA.xml ファイルからフォント名、ページ番号、相対的な位置、テキストが判断できます。
3)次にPDFからコチラのやり方を参考にして、
テキストに対してのPDF上の座標を取得します。その座標と AA.xml ファイル内の位置との関連付けを行います。
その情報を元に更にコチラのやり方を参考にしてハイライト表示を行います。
まとめ:
・1と2は一日で十分でしょう。3に関する情報は(日本語)ネットにも無いので、2週間以上は覚悟してください。Acrobat JavaScriptを少しは理解しないと出来ない部分なので無理かもしれない・・・。
・3のハイライト表示は諦めて、2の結果を別の方向に向けることをオススメします。
=============================================
これ以降は、サイト管理者の技術メモです。見なくても結構です。
▼① Popperのpdftohtml.exeでのHTML出力
サンプル:
>pdftohtml -c -i -fontfullname "X:\output\AA.pdf"
ページ単位での出力が可能。
ヘッダー、フッターも出力されている。
フォント名は「専用の英字」になっているが判断は可能と予測。
※ -fontfullname :このオプションでフォント名が出力される
▼② Acrobat OLEでのHTML出力
関数:PDFを特定のフォーマットに変換する
http://pdf-file.nnn2.com/?p=768
上記ではヘッダーはまとまって出力される。
フッターは出力されません。
ページ番号を出力するオプションは無し。現状では分からない。
▼③ Acrobat本体の手作業のHTML出力
ページ指定は無し
ヘッダー、フッターのコントロールは無し
フッターは出力されない。
▼④ Acrobat本体の手作業のXML出力
ページ指定は無し
ヘッダー、フッターのコントロールは無し
フッターは出力されない。
▼XML出力の例、一部のみ
<text top="255" left="112" width="59" height="14" font="0">本文目次</text>
<text top="291" left="112" width="53" height="14" font="1">はじめに</text>
<text top="313" left="112" width="52" height="14" font="1">PDFとは</text>
<text top="334" left="112" width="69" height="14" font="1">PDFの現状</text>
▼Acrobat JavaAScriptのgetPageNthWordQuads出力で得たテキストの座標値(Quads値)
'0[Left] 1[Top] 2[Right] 3[Top] 4[Left] 5[Bottom] 6[Right] 7[Bottom]
Page=0>1=0 (本) *[74.52000427246094 ,671.9266357421875 ,84.12001037597656 ,671.9266357421875 ,74.52000427246094 ,662.3651733398438 ,84.12001037597656 ,662.3651733398438]
Page=0>2=0 (文) [84.30049133300781 ,671.9266357421875 ,93.90049743652344 ,671.9266357421875 ,84.30049133300781 ,662.3651733398438 ,93.90049743652344 ,662.3651733398438]
Page=0>3=0 (目) [94.14044189453125 ,671.9266357421875 ,103.74044799804688 ,671.9266357421875 ,94.14044189453125 ,662.3651733398438 ,103.74044799804688 ,662.3651733398438]
Page=0>4=0 (次) [103.98039245605469 ,671.9266357421875 ,113.58039855957031 ,671.9266357421875 ,103.98039245605469 ,662.3651733398438 ,113.58039855957031 ,662.3651733398438]
Page=0>5=0 (は) *[74.52000427246094 *,647.8666381835938 ,84.12001037597656 ,647.8666381835938 ,74.52000427246094 ,638.30517578125 ,84.12001037597656 ,638.30517578125]
Page=0>6=0 (じ) [84.13157653808594 ,647.8666381835938 ,91.48524475097656 ,647.8666381835938 ,84.13157653808594 ,638.30517578125 ,91.48524475097656 ,638.30517578125]
Page=0>7=0 (め) [91.49681091308594 ,647.8666381835938 ,100.90476989746094 ,647.8666381835938 ,91.49681091308594 ,638.30517578125 ,100.90476989746094 ,638.30517578125]
Page=0>8=0 (に) [100.91633605957031 ,647.8666381835938 ,109.94989013671875 ,647.8666381835938 ,100.91633605957031 ,638.30517578125 ,109.94989013671875 ,638.30517578125]
XMLの位置情報からQuads値を計算で出すことは出来ない。相対的な位置での判断をプログラム上でしないと出来ない。ロジックは厄介だが出来るはず。
以上。