

Python3で下図のようなpdfからデータを取り出したいと考えています。  
ネット上のコードを参考にし、pdfminerによってpdfデータを取得することは出来たのですが、データを横方向に読み込むことが出来ず、下記のような塊で関連付いた結果になってしまいました。  
最終的には横方向に関連付いたリストを作成したいのですが、どうすればよいか教えて下さい。  
宜しくお願い致します。

[PDF file "TEST.pdf"]  
<https://files.fm/u/7r6rn3eu>

[![イメージ](https://i.stack.imgur.com/5ApR6.jpg)](https://i.stack.imgur.com/5ApR6.jpg)

[Code]

[code]

    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfparser import PDFDocument
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
    from pdfminer.converter import PDFPageAggregator
    from pdfminer.layout import LAParams
    from pdfminer.layout import LTTextBoxHorizontal
    
    # Open a PDF file.
    fp = open('TEST.pdf', 'rb')
    # Create a PDF parser object associated with the file object.
    parser = PDFParser(fp)
    document = PDFDocument()
    parser.set_document(document)
    # Create a PDF document object that stores the document structure.
    document.set_parser(parser)
    # Create a PDF resource manager object that stores shared resources.
    rsrcmgr = PDFResourceManager()
    # Set parameters for analysis.
    laparams = LAParams()
    # Create a PDF page aggregator object.
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    
    pages = list(document.get_pages())
    pagecontents = []
    for i in range(len(pages)):
        page_1 = pages[i] 
        interpreter.process_page(page_1)
        layout = device.get_result()
        for l in layout:
            if isinstance(l, LTTextBoxHorizontal):
                pagecontents.append(l.get_text())
    
    print(pagecontents)
    
[/code]

[結果]

[code]

    '1.1\n',
    '1.2\n',
    '1.3\n',
    '1.4\n',
    '1\n2\n3\n',
    '1\n2\n3\n4\n5\n',
    'General\nFirst Name\nLast Name\nGender\n',
    'Registry\n',
    'Number\n',
    'Contacts\nTEL number\nFax number\nMobile number\n',
    'International number\n',
    'Email address\n',
    'ABCDE\nXXXXX\n',
    'JAPAN\n',
    'C6S2076\n',
    '123456789 / 123456789 \n123456789\n123456789 XXXX\n123456789\n12345@6789.com\n']
    
[/code]

[最終出力イメージ]

[code]

    List[0] = ["1.1","General"]
    list[1] = ["1","First Name","ABCDE"]
    ....
    List[11] = ["5","Email address", "12345@6789.com"]
    
[/code]

参考にしたコード  
<http://cartman0.hatenablog.com/entry/2017/08/26/022957>


CC BY-SA 4.0
2018-06-07T01:28:55.117
44575
2018-09-03T11:00:55.510
2018-06-07T07:19:11.177
19110
28811
question
python python3 pdf
python PDFデータ抽出


PyCharmでデバッグしてみましたが、変数`layout`が`LTTextBoxHorizontal`型のリストになっていて、この`LTTextBoxHorizontal`型のオブジェクトがPDF内での配置をxy座標の点で保持しているように見えます。なので、この値を使えば、目的の「最終出力イメージ」を達成できるのではないかと思います。

[![画像の説明をここに入力](https://i.stack.imgur.com/qGznQ.png)](https://i.stack.imgur.com/qGznQ.png)

ただ、PDFの内部構成をよりよく表しているオブジェクトを取得するようなロジックがあるのかもしれません（このライブラリは初めて触ったので、詳しい仕様は知りません...）。以下を確認して、正しい実装を調査してみて下さい。

  * PDFMinerのドキュメント
  * PDFの標準規格（ISO 32000-1？）
  * PyCharmなどのIDEで確認できるPDFMinerのオブジェクトの構造


CC BY-SA 4.0
2018-06-07T08:46:56.287
44593
2018-06-07T08:46:56.287
21092
44575
answer