アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

PDF形式で受取り、テキストデータを抜いて使うのは現実的な選択肢になるのか?(pdfminer.six)

PDF形式のデータはごく一般的に存在します。

 

なので、何か処理する時のインプットデータになることがあります。

 

あまり、ややこしいことはする気はないです。

 

でも、PDFからテキストくらい抜き出せないかな・・と思って試してみました。

 

簡単にできると思ったら、なかなか厄介でした

 

まず、PDFのバリエーションがすごいです。

 

様々なバージョンはありますし。

 

暗号化されていたり、しますし。

 

そのへんの事は、Wikipediaにも乗ってます。(Portable Document Format - Wikipedia

 

プログラミングでデータとして使おうとすると、結構面倒な形式ではあります。

 

とりあえず、pdfminerというのを使ってみよう

 

pipでPDFをキーワードで検索すると、いっぱいでてきます。

 

例えば、htmlをPDFに変換するとか、Markdown形式ファイルをPDF化するなど、特定の用途に適したものがいっぱい。

 

テキストを抽出するという観点では、「pdfminer」というのが良さそうです。

 

割合、かんたんにつかえて、テキスト抽出の精度も高そうですし、それを使えば、なんとなくいけそうな気はします。

 

さっそく、試してみます。

 

動作確認用のPDFは2段組のちょっと複雑なものにしてみようかな。

f:id:arakan_no_boku:20180103145351j:plain

 

pdfminerをインストールして、動作確認する

 

ちょっと、混乱したのはpdfminerと一口に言っても、いろいろあるみたいなことです。

 

pip search pdfminer とやってみると、3つのバージョンがでてきます。

  • pdfminer   / python2.xx系
  • pdfminer3k  / python3.xx系
  • pdfminer.six  / python2/3系共通

 

でも、現在でも更新されているのは「pdfminer.six」だけみたいです。

github.com

 

他のも使えるみたいですけど。

 

python2と3でコンパチブルなのも、pdfminer.sixだけだし、これを使わない理由も特に見当たりません。

 

インストールするのは、pdfminer.sixです。

pip install pdfminer.six

 

インストールできたら、軽く動作確認します。

 

pdfminer.sixには、pdf2txt.py というツールが付属してます。

 

これは、anacondaをインストールしたフォルダ(activateして仮想環境にしている場合はenvsの仮想環境名フォルダの下)のScriptsフォルダにインストールされてます。

 

Linux環境なら、パスが通っているのでそのまま実行できるのですが、windowsでは無理なので、適当な作業フォルダに「sample.pdf」ファイルを置き、同じところに「pdf2txt.py」をコピーして、以下のようにします。

python pdf2txt.py sample.pdf

 

 抽出されたテキストはこんな感じでした。

キーワー ド:ビ ッグファイブパーソナリテ ィ 質問紙法 尺度構成 , 信頼性, 妥当性

問題

Openness to Experience (Openness; 開放性)で

ある 。

近年のパーソナリティ特性論において, もっと

日本における語裳研究は背木 ( 1971 ) の先駆的

も確固たる 知 見を積み重ねているのは. Big Five

な研究に始まり,その後も継続的に行われている

( ビッグファイブ; Goldberg, 1990, 1992 ) や Five

(柏木・辻・藤島・山田 2005 ;柏木 ・和田・ 青

Factor Model ( 5 因 子モデル; ~、1cCrae & Costa,

木 , 1993; 村 上, 2003; 和田, 1996 ) 。 また , 日

1987 ) である 。

 

化けたりはしてませんが、改行や空白がランダムにはいっているので、テキストデータとして処理するには、ちょっとめんどくさいデータになってます。

 

空白・改行を詰めてテキストを抽出する関数を書いてみる

 

なので、今度は付属のツールをそのまま使うのでなく、pdfminerを使ってテキストを抽出するpythonプログラムを書いてみます。

 

最後に、正規表現を使って、半角空白・全角空白・改行・タブを除去します。

 

ソース全文はこんな感じ。

# -*- coding: utf-8 -*-

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
import re 

def gettext(pdfname):
    # PDFファイル名が未指定の場合は、空文字列を返して終了
    if (pdfname == ''):
        return ''
    else:
        # 処理するPDFファイルを開く/開けなければ
        try:
            fp = open(pdfname, 'rb')
        except:
            return ''
        
    # リソースマネージャインスタンス
    rsrcmgr = PDFResourceManager()
    # 出力先インスタンス
    outfp = StringIO()
    # パラメータインスタンス
    laparams = LAParams()
    # 縦書き文字を横並びで出力する
    laparams.detect_vertical = True
    # デバイスの初期化
    device = TextConverter(rsrcmgr, outfp, codec='utf-8', laparams=laparams)
    # テキスト抽出インタプリタインスタンス
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # 対象ページを読み、テキスト抽出する。(maxpages:0は全ページ)
    for page in PDFPage.get_pages(fp, pagenos=None, maxpages=0, password=None,caching=True, check_extractable=True):
        interpreter.process_page(page)
    #取得したテキストをすべて読みだす
    ret = outfp.getvalue()
    # 後始末をしておく    
    fp.close()
    device.close()
    outfp.close()
    # 空白と改行をとりさり一塊のテキストとして返す
    return re.sub(r"\s| ",'',ret)

 この関数を使って、テキストに出力するときは、こうします。

import pdf2text as pt

ret = pt.gettext('C:\\myWork\\00_python\\workspace\\src\\proc\\sample.pdf')
print(ret)

 

 出力結果です。

 

キーワード:ビッグファイブパーソナリティ質問紙法尺度構成,信頼性,妥当性問題OpennesstoExperience(Openness;開放性)である。近年のパーソナリティ特性論において,もっと日本における語裳研究は背木(1971)の先駆的も確固たる知見を積み重ねているのは.BigFiveな研究に始まり,その後も継続的に行われている(ビッグファイブ;Goldberg,1990,1992)やFive(柏木・辻・藤島・山田2005;柏木・和田・青Model(5因子モデル;~、1cCrae&Costa,rotcaF木,1993;村上,2003;和田,1996)。また,日1987)である。

 

うん、見た目はいい感じです。

 

でも、よーく見ると、二段組の処理ができてなくて、左と右の文章が混じってしまってますけどね。

 

段組みとかの複雑な文章は、文字数カウントや単語分割して分析するような用途ならなんとかなっても、きちんとした文章としてとりだすのは難しいかもです。

 

でも、うまくいかないファイルが多すぎるなあ

 

これで色々なPDFファイルから、テキストを抽出してみました。

 

結果として、うまくいかないものが多いですね。

 

テキストに見えていても画像がはりついていて、抽出できないとか。

 

ファイルが暗号化されていて読めないとか。

 

読めて、テキストが抽出できても、2バイト文字が化けるとか。

 

特に最後の文字化けはかなりうざいです。

 

PDFで見ていると同じように見えるのに、テキストを抽出してみると、例えば、以下のように表示されたりします。

蜘蛛(cid:12506)糸芥川龍之介(cid:13268)(cid:10187)(cid:13269)(cid:13268)(cid:10186)(cid:13269)一(cid:12680)(cid:12695)(cid:12765)(cid:12681)(cid:12693)(cid:12734)

 

だから、正直「やってみないと、上手く行くかどうかわからない」です。

 

結論としては、 加工や解析をするインプットデータとして受け取るには、PDFファイルは適切ではないなと思いますね。