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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

PDF

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

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6066閲覧

PDF文字の下線罫線の情報抽出存在チェックやデータ振り分けを行いたい

dendenmushi

総合スコア98

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

PDF

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

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/10/24 03:50

編集2018/10/28 09:26

前提・実現したいこと

PDFファイルに記載された文字に下線が引かれているデータを抽出したい。引かれているのといないので区別したい。
※PDF編集で入れた?罫線のようです。どのように記載したかは不明。

イメージ説明

pythonでPDFの文字解析を行い、そのデータに下線が引かれているか確認し区別するアプリを作っています。
pythonモジュールpdfminer3kで解析を行いました。

該当のソースコード

Anaconda prompt Scripts> pdf2txt.py data.pdf > text2.csv Scripts> py >>> import csv >>> example_file = open('text2.csv') >>> example_reader = csv.reader(example_file) >>> example_data = list(example_reader) >>> example_data[5]

csvの5行目にある住所に下線がPDFでは引かれていたのですが、抽出すると以下の様にただの文言になっていました。

発生している問題

\u3000大阪市倍野区\u3000\u3000\u3000\u3000\u3000

試したこと

エクセルで文字に罫線を引きPDF出力

イメージ説明

上記解析を試しました。

イメージ説明

’\x0c’という罫線情報らしきものは抽出できましたが、実際の一番上の画像のような罫線下線とは違いますので意味がないと思い、途方に暮れています。

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

win10
python3.6.0
Anaconda3
anaconda-script.py Command line client (version 1.6.0)

もし何かアドバイスいい案などご掲示頂ければ幸いです。
よろしくお願い致します。

###pdf2txt.py

python

1#!C:\ProgramData\Anaconda3\python.exe 2import sys 3import io 4import getopt 5 6from pdfminer.pdfinterp import PDFResourceManager, process_pdf 7from pdfminer.pdfdevice import TagExtractor 8from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter 9from pdfminer.layout import LAParams 10from pdfminer.utils import set_debug_logging 11 12def main(argv): 13 def usage(): 14 print(('usage: %s [-d] [-p pagenos] [-m maxpages] [-P password] [-o output] [-C] ' 15 '[-n] [-A] [-V] [-M char_margin] [-L line_margin] [-W word_margin] [-F boxes_flow] ' 16 '[-Y layout_mode] [-O output_dir] [-t text|html|xml|tag] [-c codec] [-s scale] file ...' % argv[0])) 17 return 100 18 try: 19 (opts, args) = getopt.getopt(argv[1:], 'dp:m:P:o:CnAVM:L:W:F:Y:O:t:c:s:') 20 except getopt.GetoptError: 21 return usage() 22 if not args: return usage() 23 debug = False 24 # input option 25 password = '' 26 pagenos = set() 27 maxpages = 0 28 # output option 29 outfile = None 30 outtype = None 31 outdir = None 32 layoutmode = 'normal' 33 codec = 'utf-8' 34 pageno = 1 35 scale = 1 36 caching = True 37 showpageno = True 38 laparams = LAParams() 39 for (k, v) in opts: 40 if k == '-d': debug = True 41 elif k == '-p': pagenos.update( int(x)-1 for x in v.split(',') ) 42 elif k == '-m': maxpages = int(v) 43 elif k == '-P': password = v 44 elif k == '-o': outfile = v 45 elif k == '-C': caching = False 46 elif k == '-n': laparams = None 47 elif k == '-A': laparams.all_texts = True 48 elif k == '-V': laparams.detect_vertical = True 49 elif k == '-M': laparams.char_margin = float(v) 50 elif k == '-L': laparams.line_margin = float(v) 51 elif k == '-W': laparams.word_margin = float(v) 52 elif k == '-F': laparams.boxes_flow = float(v) 53 elif k == '-Y': layoutmode = v 54 elif k == '-O': outdir = v 55 elif k == '-t': outtype = v 56 elif k == '-c': codec = v 57 elif k == '-s': scale = float(v) 58 59 if debug: 60 set_debug_logging() 61 rsrcmgr = PDFResourceManager(caching=caching) 62 if not outtype: 63 outtype = 'text' 64 if outfile: 65 if outfile.endswith('.htm') or outfile.endswith('.html'): 66 outtype = 'html' 67 elif outfile.endswith('.xml'): 68 outtype = 'xml' 69 elif outfile.endswith('.tag'): 70 outtype = 'tag' 71 if outfile: 72 outfp = io.open(outfile, 'wt', encoding=codec, errors='ignore') 73 close_outfp = True 74 else: 75 outfp = sys.stdout 76 close_outfp = False 77 if outtype == 'text': 78 device = TextConverter(rsrcmgr, outfp, laparams=laparams) 79 elif outtype == 'xml': 80 device = XMLConverter(rsrcmgr, outfp, laparams=laparams, outdir=outdir) 81 elif outtype == 'html': 82 device = HTMLConverter(rsrcmgr, outfp, scale=scale, layoutmode=layoutmode, 83 laparams=laparams, outdir=outdir, debug=debug) 84 elif outtype == 'tag': 85 device = TagExtractor(rsrcmgr, outfp) 86 else: 87 return usage() 88 for fname in args: 89 fp = io.open(fname, 'rb') 90 process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password, 91 caching=caching, check_extractable=True) 92 fp.close() 93 device.close() 94 if close_outfp: 95 outfp.close() 96 97if __name__ == '__main__': 98 sys.exit(main(sys.argv)) 99

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

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

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

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

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

ikedas

2018/10/28 07:28

pdf2txt.pyの内容を提示下さい。「pythonでPDFの文字解析を行い」とだけ書かれても、具体的にどのような解析をしたのかわかりません。
dendenmushi

2018/10/28 09:26

失礼しました。詳細コード追記しました。
guest

回答2

0

参考までに過去回答を提示します。
pdfの文字列変換(下線・取り消し線付き)
ikedasさんも回答されているとおり、画像として引かれている場合は下線を認識・抽出するのは厳しいです。

投稿2018/10/29 05:14

can110

総合スコア38262

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

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

dendenmushi

2019/04/17 21:30

回答ありがとうございました。
guest

0

ベストアンサー

PDFを理解する

まず、PDFというデータ形式がどんな構造になっているのかを理解しておいたほうがいいです。そうしないと、どうやって自分の取り出したい情報を取り出せばいいのか見当もつきませんよね。参考書を挙げておきます。

どちらか一方があればいいとおもいます。また、全てを一気に理解する必要はないです。知りたいことがでてきたら、これらのどこかに書いてないか探せばいいです。

PDFMinerを理解する

pdf2txt.pyというのは、PDFMinerについてくるスクリプトのことだったのですね。まず、このスクリプトがなにをするのか (どんな情報を抽出できるのか) を理解する必要があります。それには、PDFMinerを理解しなければなりません。

公式ドキュメント: PDFMiner: Python PDF parser and analyzer

PDFMiner自身は、PDF文書を解析することができるようですね。解析した構造は当然、前節のPDFの構造を表しているはずです。しかし、(説明は省きますが) pdf2txt.pyは、解析した内容のすべてを出力してくれているわけではないようです。

自分がやりたいことを理解する

「文字に下線が引かれている」という状況が、PDFの構造の中でどのように表現されているのか知る必要があります。最初の節の参考資料を読んで考えてみると、次のような場合がありそうです。

  • Annotation (ノートやリンクなど) がついたテキスト。
  • Graphics (図や画像)。
    後者は、テキストのすぐ下に表示されていれば下線に見えますが、テキストと関連付けられていないので抽出は難しいとおもわれます (質問者さんがExcelで試したものは後者でしょう)。

そして、これがPDFMinerでの解析結果ではどのように表現されているかを理解すれば、下線のあるテキストを抽出できることになります。

例として、このプログラムはPDFMinerを使ってPDFを解析し、annotationの部分を抽出できるようです。参考にしてはどうでしょうか。

投稿2018/10/29 05:09

ikedas

総合スコア4333

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

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

dendenmushi

2019/04/17 21:30

素晴らしいです。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問