0
私はpdfドキュメントの一部のテーブルから情報を抽出しようとしています。
入力を考えてみましょう:PDFMinerでPDFからテーブルを抽出するには?
Title 1
some text some text some text some text some text
some text some text some text some text some text
Table Title
| Col1 | Col2 | Col3 |
|---------------|---------|---------|
| val11 | val12 | val13 |
| val21 | val22 | val23 |
| val31 | val32 | val33 |
Title 2
some more text some more text some more text some more text
some more text
some more text some more text some more text some more text
私のようなアウトライン/タイトルを取得することができます。
path='myFile.pdf'
# Open a PDF file.
fp = open(path, 'rb')
# Create a PDF parser object associated with the file object.
parser = PDFParser(fp)
# Create a PDF document object that stores the document structure.
# Supply the password for initialization.
document = PDFDocument(parser, '')
outlines = document.get_outlines()
for (level,title,dest,a,se) in outlines:
print (level, title)
これは私に与える:
レベルが整列されるように、完璧です(1, u'Title 1')
(2, u'Table Title')
(1, u'Title 2')
をテキスト階層。次のように今、私はテキストを抽出することができます。
if not document.is_extractable:
raise PDFTextExtractionNotAllowed
# Create a PDF resource manager object that stores shared resources.
rsrcmgr = PDFResourceManager()
# Create a PDF device object.
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
# Create a PDF interpreter object.
interpreter = PDFPageInterpreter(rsrcmgr, device)
# Process each page contained in the document.
text_from_pdf = open('textFromPdf.txt','w')
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
layout = device.get_result()
for element in layout:
if isinstance(element, LTTextBox):
text_from_pdf.write(''.join([i if ord(i) < 128 else ' '
for i in element.get_text()]))
私を与える:テーブルは列方向の方法で抽出されたように、ビット奇妙です
Title 1
some text some text some text some text some text some text some text
some text some text some text some text some text some text some text
Table Title
Col1
val11
val12
val13
Col2
val21
val22
val23
Col3
val31
val32
val33
Title 2
some more text some more text some more text some more text
some more text
some more text some more text some more text some more text
を。私は行ごとにテーブルを取得することは可能でしょうか?さらに、テーブルの開始と終了の場所を特定するにはどうすればよいですか?
テーブルを列ごとに抽出し、それを2Dリスト(リストのリスト)に格納することができれば、それを転置して行単位のフォーマットにすることができます。これは組み込みの['zip()'](https://docs.python.org/3/library/functions.html#zip)関数でよく行われます。テーブルの終わりを見つけるためには、フォーマットの変更を検出できるかどうかを確認する必要があります。 – martineau
ありがとう、しかし、問題は私はテーブルがどこで始まるか分からない。私の文書のどのタイトルも表を示すことができます。どのように私は知っていますか? – AbtPst
pdfドキュメントのソースが1つだけの場合、テーブルの構築方法にパターンがある可能性があります。あなたがそれを理解してそれを見ることができれば。残念なことに、私はpdfファイルに正式な "テーブル"要素があるとは思わないので、そのようなことをすることはあなたの唯一の手段かもしれません。 – martineau