使用Pdfminer水平阅读pdf文件

4

我想使用 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的屏幕截图:enter image description here 问题在于,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横向读取文本?
1个回答

0

我已经找到了一个可行的解决方案,使用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。 - rom
这些情况下,pdftotext更好还是反之有什么模式吗? - Yaegz
据我所知,这取决于PDF文件格式。但是我不知道如何检测这些“模式”,只能通过试错方法... - rom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接