VB.NETでPDFファイル内のテキスト情報を取り出すプログラムを
作りたいのですが、AcrobatReaderに付属のPDF.OCXを組み込んで
みてもそれらしいメソッドがないようで、どなたかやり方判る方いませんか?
やりたい事は「AcrobatReader->ファイル->テキストとして保存」のみです。
私自身、こんな事を行うのは初めてで情報がなく、AcrobatSDKが必要とか、
そもそも無理とゆう情報でも結構なので、ご存知の方教えて下さい。
以前VC++にあった書き込みが参考になりそうですよ。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200307/03070047.txt
AcrobatSDKを使えば、もちろんできますが、ベタで解析するための参考になる情報が入ってますよ。
<SDKを使わずにベタで取得する方法>
(全体の作業)
1)まず、相互参照テーブル(個々のPDFオブジェクトの位置情報)をPDFファイルから取得
2)PDFのページ数と個々のページID(/Pageのオブジェクト番号)を列挙
(ページごとの作業)
3)ページのリソース(/Resources)を列挙(主にフォント関連)
4)ページのストリーム(stream ... endstream)が圧縮されている場合は展開
5)そのストリームからテキスト関連のオペレータに従ってテキストを取得
(テキストは'BT' .. 'ET' 間に埋め込まれている)
[ テキスト関連のオペレータ一覧 ]
// Text object
'BT', // Begin text object
'ET', // End text object
'T*', // Move to start of next text line
'Tc', // Set character spacing
'Td', // Move text position
'TD', // Move text position and set leading
'Tf', // selectfont Set text font and size
'Tj', // show Show text
'TJ', // Show text, allowing individual glyph positioning
'TL', // Set text leading
'Tm', // Set text matrix and text line matrix
'Tr', // Set text rendering mode
'Ts', // Set text rise
'Tw', // Set word spacing
'Tz', // Set horizontal text scaling
'''', // Move to next line and show text
'"', // Set word and character spacing, move to next line, and show text
// inline image
'BI', // Begin inline image object
'EI', // End inline image object
'ID', // Begin inline image data
// Graphics State Operators
'q', // gsave Save graphics state
'Q', // grestore Restore graphics state
6)取得したテキストをお好みの文字コードに変換する
[ 主要な文字コードの一覧 ]
<欧米>
WinAnsiEncoding
MacRomanEncoding
MacExpertEncoding
StandardEncoding
<日本語>
Identity-H Ext-RKSJ-H
Identity-V Ext-RKSJ-V
83pv-RKSJ-H EUC-H
90pv-RKSJ-H EUC-V
90ms-RKSJ-H H
90ms-RKSJ-V V
90msp-RKSJ-H UniJIS-UCS2-H
90msp-RKSJ-V UniJIS-UCS2-V
Add-RKSJ-H UniJIS-UCS2-HW-H
Add-RKSJ-V UniJIS-UCS2-HW-V
# 細かい所はかなり省略しているのでわかりにくかったらごめんなさい。
sato様、pbmplus様、返事が遅れてしまい申し訳ありません。
また、有効な情報有り難う御座いました。
頂いた情報とリンクにありましたページを参考にPDFファイルの中をあれこれ
覗いてみてベタ読み出来そうな事が判りました。
ただこれをプログラムで作成するのは大変そうですね^^;
頑張って挑戦してみます。
本件はこれで解決とさせて頂きます。
有り難う御座いました。
ツイート | ![]() |