実現したいこと
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)
試したこと
違うソースで読み込みんでみたら、以下のような内容が出力された
'\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c'
試したソース
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 from glob import glob def convert_pdf_to_txt(path): # 引数にはPDFファイルパスを指定 rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() laparams.detect_vertical = True # Trueにすることで綺麗にテキストを抽出できる device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) fp = open(path, 'rb') interpreter = PDFPageInterpreter(rsrcmgr, device) maxpages = 0 caching = True pagenos=set() fstr = '' for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,caching=caching, check_extractable=True): interpreter.process_page(page) str = retstr.getvalue() fstr += str fp.close() device.close() retstr.close() return fstr inpname = 'kanban_apc_print.pdf' #inpname = 'pdf_test1.pdf' convert_pdf_to_txt(inpname)
0 コメント