【问题标题】:read pdf file horizontally with pdfminer使用 pdfminer 水平读取 pdf 文件
【发布时间】:2014-10-29 14:44:27
【问题描述】:

我想提取带有pdfminer(版本20140328)的pdf。

这是提取pdf的代码:

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO
import urllib2

def pdf_to_string(data):
    fp = StringIO(data)
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)

    # Process each page contained in the document.
    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    return data

pdf_url="http://www.consilium.europa.eu/uedocs/cms_data/docs/pressdata/en/ecofin/140836.pdf"
file_object = urllib2.urlopen(urllib2.Request(pdf_url)).read()
string=pdf_to_string(file_object)

这是pdf的截图:

问题是pdfminer 不是水平读取它(人然后位置)而是在列中(所有人然后他们各自的位置):

Belgium: 
Mr Koen GEENS 

Bulgaria: 
Mr Petar CHOBANOV 

Czech Republic: 
Mr Radek URBAN 


Minister for Finance, with responsibility for the Civil 
Service 

Minister for Finance 

Deputy Minister for Finance 

如何让pdfminer横向阅读文字?

【问题讨论】:

    标签: python pdf extract pdfminer


    【解决方案1】:

    我通过 pdftotext 找到了一个可行的解决方案:

    import tempfile, subprocess
    
    def pdf_to_string(file_object):
        pdfData = file_object.read()
        tf = tempfile.NamedTemporaryFile()
        tf.write(pdfData)
        tf.seek(0)
        outputTf = tempfile.NamedTemporaryFile()
    
        if (len(pdfData) > 0) :
            out, err = subprocess.Popen(["pdftotext", "-layout", tf.name, outputTf.name ]).communicate()
            return outputTf.read()
        else :
            return None
    
    pdf_file="files/2014_1.pdf"
    file_object = file(pdf_file, 'rb')
    print pdf_to_string(file_object)
    

    这会产生正确的输出,人名然后是职位:)。

    解决了!

    【讨论】:

    • 好吧,在某些情况下 PDFMiner 效果更好,在其他情况下 pdftotext 效果更好......在那种情况下,我确实放弃了 PDFMiner。
    • 在这些情况下,pdftotext 更好,反之亦然?
    • 据我了解,这取决于 pdf 文件格式。但我不知道如何检测那些“模式”,只是试错法......
    猜你喜欢
    • 2021-07-24
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多