teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

791閲覧

PDFデータが読み込み内

fhiro_tokio

総合スコア66

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/07/21 05:59

編集2023/07/21 08:11

0

0

実現したいこと

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

x_startx_endy_starty_endtextpage
0198.46576.074254.1891366.512プログラム講習1
1198.46385.8969162.-711194.1112023/5/111

発生している問題

正常に読み込める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)

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

フォントやテキストのエンコーディング問題かもしれません。
PDFは特定のフォントやレイヤーでエンコードされている場合があり、
そのフォントがPDFMinerによって正しく解釈できない場合テキストの抽出ができません。
例えばPyPDF2やPDFBoxなどは試されたでしょうか?
この問題を解決するためには、まずPDFがどのようにテキストを格納しているかを判断し、
各PDFのエンコーディングに合わせてプログラムを変える必要があります。

投稿2023/07/21 06:05

Ripple_py

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fhiro_tokio

2023/07/21 08:18 編集

Acrobat Reader の文書プロパティを確認したら、フォントが入っていませんでした。 正しく表示されるのは、フォントが入っています。 フォントが入っていないのが問題のようです。 ご指摘ありがとうございます。 複合機でPDFにしているのですが、複合機でどのようにするかは、これから調査してみます。
TakaiY

2023/07/21 12:16

横からすみません。 複合機というのはコピー機のことで、紙の資料をPDFにしているということでしょうか? だとすると、データは画像として入っているので、内部のデータは取りだせないのではないかと思います。 OCR処理をしているのであればまた別ですが。
fhiro_tokio

2023/07/24 00:16

複合機はコピー機能が含まれます。フォント機能が含まれるPDFを作成してくれる複合機があるのですが、今回の複合機だとフォント機能が含まれないものでした。複合機のオプション機能かもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問