PDFデータが読み込み内

実現したいこと

PDFファイルを読み込み、座標軸とテキスト、ページをcsvに出力したい。
出力結果は以下のようになります。

x_start x_end y_start y_end text page
0 198.46 576.074 254.1891 366.512 プログラム講習 1
1 198.46 385.8969 162.-711 194.111 2023/5/11 1

発生している問題

正常に読み込めるPDFがある一方、何も出力されないPDFがある
何も出力されないPDFは、Acrobat reader では問題なく表示されている

該当のソースコード

from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams, LTContainer, LTTextBox from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager from pdfminer.pdfpage import PDFPage import pandas as pd #inpname = 'kanban_copy.pdf' ### 表示される inpname = 'kanban_apc.pdf' ### 何も表示されない #inpname = 'pdf_test1.pdf' ### 表示される def find_textboxes(layout): if isinstance(layout, LTTextBox): return [layout] elif isinstance(layout, LTContainer): boxes = [] for child in layout: boxes.extend(find_textboxes(child)) return boxes else: return [] with open(inpname,"rb") as f: # print(f.read()) pdfPages = PDFPage.get_pages(f) #文字読み取りのルール指定 # 文字がうまく読み取れないときは、ここを変更してみる laParams = LAParams(line_overlap = 0.5, word_margin = 0.1, # 単語間の間隔 char_margin = 2, # 文字間の間隔 line_margin = 0.5, # 行間の間隔 detect_vertical = True) #共有のリソースを管理するリソースマネージャー作成 resourceManager = PDFResourceManager() #ページ集約 device = PDFPageAggregator(resourceManager, laparams=laParams) #インタプリタオブジェクト作成 interpreter = PDFPageInterpreter(resourceManager, device) df = pd.DataFrame() #ページごとに処理 for page_no, page in enumerate(pdfPages, start=1): #ページ処理 interpreter.process_page(page) #LTPageオブジェクトを取得 layout = device.get_result() #1ページ内のテキストのまとまりのリストを取得 boxes = find_textboxes(layout) #テキストひとまとまりごとに処理 for box in boxes: df_page = pd.DataFrame({"x_start":[box.x0], "x_end" :box.x1, "y_start":box.y0, "y_end" :box.y1, "text" :box.get_text().strip(), "page" :page_no} ) df = df.append(df_page) df = df.reset_index(drop=True) with open("output.csv", mode="w", encoding="cp932", errors="ignore", newline="") as f: df.to_csv(f)

補足情報(FW/ツールのバージョンなど)

コメントを投稿

0 コメント