小ネタ:pdftotextで文字データを抽出

2024/8/28 [15:40:57] (水) 天気

元データがPDFで、圏点(傍点)やダッシュをPDFから検出する必要にせまられた。

目視確認などありえないんで、テキストデータとして取り出して検索しよう、というのが今回のエントリ…というかエントリにするまでもない内容なんだけど、たぶんそのうち忘れるんで、メモ。


PDFから文字情報だけをひっぱりだすのに定番の「pdftotext」というツールを使う。

perlだけでもできそうなんだけど(PDF::API2あたり)ちょっと時間も押してるんで、外部ツールを間に挟むことにした。


まずは肝腎のpdftotextのインストール。これがpoppler-utilsというパッケージだなんて検索しないとわからなかった(pdftotextというパッケージがあるもんだと思ってた)


以下のコマンドラインでインストール


sudo apt-get install poppler-utils


unix系のツールの例に漏れず、これもいろんなオプションが用意されてるけど、今回必要なのは文字情報だけ。レイアウトデザイン情報やなんかは不要。

rawオプションをつけて利用する。

image

たとえば「kappa.pdf」の文字情報を抜き出すのは


pdftotext -raw kappa.pdf


こうすると「kappa.txt」に文字情報を吐き出す。ただ、これだとひと文字ずつだあーっと出力されるので、ここからがテキストデータを扱わせたら最強のperlの出番。

image

pdftotextの出力には改ページがつくので、そこで改行すれば「それっぽい段落」ごとに見えるひとに優しいテキストファイルとなる。


open(P, ’-|’, ’pdftotext -raw kappa.pdf - ’ ) || die;
binmode STDOUT => ":utf8";
open(OUT, ’>’ , ’kappa.txt’) || die;
binmode OUT => ":utf8";
while(<P>){
    my $line = Encode::decode(’utf8’, $_);
    $line =~ s!\r?\n!!;
    $line =~ s!\x{C}!\n!;
    print OUT $line;
}
close(OUT);
close(P);

特筆すべきようなスクリプトじゃないんだけど。

perlは外部コマンドの「標準出力」をパイプで受け取って加工整形できる。


open(P, ’-|’, ’pdftotext -raw kappa.pdf - ’ )


openの

・第2引数で、標準出力を受け取りますよ、という指定

・第3引数はpdftotextの結果を標準出力に出すからね、という指定

これだけでそれっぽい段落にわけたテキストファイルを作ってくれる。


そうしたら、あとは出力されたテキストファイルからダッシュや圏点(傍点)っぽいものをperlで検知するだけ。

image
これはワードで作ったPDFで「、」が圏点となっている。inDesignで作られたデータだと「0」(ゴマ)「4」(ドット)となる。


直接触ってもいいんだけど、一度テキストファイルに吐き出したほうがなにかわからないことが起こった時に便利なので、こういう仕様、段取り。


このスクリプトのおかげで抜け漏れは捕捉できるんでずいぶんラクになった。


以前、目視確認とか無駄なだけだし、んなもんツール作ってやればいいじゃん、とか言ったら、そしたら仕事がなくなる、目視確認手作業修正は必須だ、と言われて心底、呆れた。

カネをもらった上で、人間の作業=ミスが入り込む原因になる工程を入れるって、いろいろ悪質すぎる。

ITといってもピンキリで、こんなのが入り込んでるから要注意。

そもそも、その程度の仕事なんて、なくなっても問題ないし、特に困らない。

<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】