副反応疑い報告状況についてのPDFをCSVに変換


予防接種法に基づく医療機関からの副反応疑い報告状況について(コミナティ筋注・報告症例一覧) (PDF:5,092KB)
https://www.mhlw.go.jp/content/10601000/000853766.pdf

pdfplumberでテーブルを抽出しようとすると表の最後に線がないため最終行が取得できない

縦線の下の位置を取得して最終の横線を追加

縦線を追加

テーブル確認

PDFダウンロード

!wget https://www.mhlw.go.jp/content/10601000/000853766.pdf -O data.pdf

プログラム

import pdfplumber
import pandas as pd

from tqdm.notebook import tqdm

with pdfplumber.open("data.pdf") as pdf:

    dfs = []

    for page in tqdm(pdf.pages[1:]):

        # 縦線
        vertical = [
            edge["x0"]
            for edge in page.debug_tablefinder().edges
            if edge["orientation"] == "v"
        ]

        # 縦線の一番下の位置
        bottom = max(
            [
                edge["bottom"]
                for edge in page.debug_tablefinder().edges
                if edge["orientation"] == "v"
            ]
        )

        # 横線
        horizontal = [
            edge["top"]
            for edge in page.debug_tablefinder().edges
            if edge["orientation"] == "h"
        ]

        # 横線に縦線の一番下の位置を追加
        horizontal.append(bottom)

        table_settings = {
            "vertical_strategy": "explicit",
            "explicit_vertical_lines": vertical,
            "horizontal_strategy": "explicit",
            "explicit_horizontal_lines": horizontal,
            "snap_tolerance": 3,
            "intersection_tolerance": 3,
        }

        table = page.extract_table(table_settings)

        df_tmp = pd.DataFrame(table)

        dfs.append(df_tmp)

df = pd.concat(dfs)

df.shape

df.to_csv("result.csv", encoding="utf_8_sig")