プログラミング的な

PDFをテキスト化する方法

ウェブ上からデータを探して、グラフ化し、視覚的に分かりやすくすることを最近行っているのですが、
データがPDFになっていることが多く、扱いにくいことがよくあるので、テキスト化してみました。

今回はこちらのPDFを使用しました。
待機児童_厚労省

ウィンドウズ・コマンドプロンプトよりPDFを読み込みテキスト化して保存する方法を行いました。

import sys
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTContainer, LTTextBox
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage

pycharmでコードを作成したので、まずPDFをスクレイピングするためにpdfminer.sixのパッケージをインストールしました。

def find_textboxes_recursively(layout_obj):
    if isinstance(layout_obj, LTTextBox):
        return[layout_obj]
    if isinstance(layout_obj, LTContainer):
        boxes = []
        for child in layout_obj:
            boxes.extend(find_textboxes_recursively(child))
        return boxes
    return []
laparams = LAParams(detect_vertical=True)
resource_manager = PDFResourceManager()
device = PDFPageAggregator(resource_manager, laparams=laparams)
interpreter = PDFPageInterpreter(resource_manager, device)
# windowsで出力するときエンコードエラーがでるのでencoding="utf-8_sig"を追加
output_txt = open('output.txt', 'w', encoding="utf-8_sig")

def print_and_write(txt):
    print(txt)
    output_txt.write(txt)
    output_txt.write('\n')

with open(sys.argv, 'rb') as f:
    for page in PDFPage.get_pages(f):
        print_and_write('\n=====ページ区切り=====\n')
        interpreter.process_page(page)
        layout = device.get_result()

        boxes = find_textboxes_recursively(layout)
        boxes.sort(key=lambda b: (-b.y1, b.x0))
        for box in boxes:
            print_and_write('-' * 10)
            print_and_write(box.get_text().strip())
output_txt.close()

以上がコードです。
注意点は、 上記内の以下の部分です。

# windowsで出力するときエンコードエラーがでるのでencoding="utf-8_sig"を追加
output_txt = open('output.txt', 'w', encoding="utf-8_sig")

encodin=”utf-8 sig”がないとエンコーディングエラーが出てしまいます。

あとはコマンドプロンプトからPythonを実行して、上記ファイルとpdfを実行してテキスト化完了となります。同じディレクトリ内にテキストファイルが作成されます。

C:\Users>python ファイル名.py pdf名.pdf

私はこのPDF内の県別の待機児童数が欲しかったので、それをエクセルにコピペして、地図化を行いました。

MANDARAを使用して地図化を行う

フリーGISソフトのMANDARAを使用してデータを地図上で表しました。MANDARAはフリーソフトでありながら非常に優れた機能を持っています。私もまだ始めたばかりですが、データの地図化を他の方法で描くことができない場合(スキル不足で)は非常に強力なツールだと思います。以下がそのデータを地図で表したものです。

フリーGISソフトMANDARA10パーフェクトマスター [ 谷 謙二 ]

価格:4,104円
(2019/1/1 20:18時点)
感想(0件)