ウェブ上からデータを探して、グラフ化し、視覚的に分かりやすくすることを最近行っているのですが、
データが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円 |
