2017-09-14 14 views
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 

を。私は行ごとにテーブルを取得することは可能でしょうか?さらに、テーブルの開始と終了の場所を特定するにはどうすればよいですか?

+1

テーブルを列ごとに抽出し、それを2Dリスト(リストのリスト)に格納することができれば、それを転置して行単位のフォーマットにすることができます。これは組み込みの['zip()'](https://docs.python.org/3/library/functions.html#zip)関数でよく行われます。テーブルの終わりを見つけるためには、フォーマットの変更を検出できるかどうかを確認する必要があります。 – martineau

+0

ありがとう、しかし、問題は私はテーブルがどこで始まるか分からない。私の文書のどのタイトルも表を示すことができます。どのように私は知っていますか? – AbtPst

+1

pdfドキュメントのソースが1つだけの場合、テーブルの構築方法にパターンがある可能性があります。あなたがそれを理解してそれを見ることができれば。残念なことに、私はpdfファイルに正式な "テーブル"要素があるとは思わないので、そのようなことをすることはあなたの唯一の手段かもしれません。 – martineau

答えて

0

あなたが唯一のPDF文書からテーブルを抽出したい場合は、この回答を見て:How to extract table as text from the PDF using Python?

その答えから、私は、複数ページのPDFに広がっ図のテーブルを私のために働いたtabula-pyを試してみました。 tabula-pyはすべてのヘッダーとフッターを適切にスキップしました。これまで同じ種類のドキュメントでPDFMinerを試してみましたが、あなたが言及したのと同じ問題がありました。さらに悪いこともありました。

関連する問題