是否有任何python模块转换PDF文件为文本?我尝试了在Activestate中发现的一段代码,它使用pypdf,但生成的文本之间没有空格,没有任何用处。
当前回答
此外,还有PDFTextStream,这是一个商业Java库,也可以从Python中使用。
其他回答
由于这些解决方案都不支持最新版本的PDFMiner,我写了一个简单的解决方案,将返回使用PDFMiner的pdf文本。这将适用于那些在process_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
def pdfparser(data):
fp = file(data, 'rb')
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()
print data
if __name__ == '__main__':
pdfparser(sys.argv[1])
请看下面适用于Python 3的代码:
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
import io
def pdfparser(data):
fp = open(data, 'rb')
rsrcmgr = PDFResourceManager()
retstr = io.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()
print(data)
if __name__ == '__main__':
pdfparser(sys.argv[1])
PDFminer给了我也许一行[第1页7…在我尝试使用它的pdf文件的每一页上。
到目前为止,我有最好的答案是pdftopipe,或者是基于Xpdf的c++代码。
请参阅我的问题,了解pdftopipe的输出是什么样的。
此外,还有PDFTextStream,这是一个商业Java库,也可以从Python中使用。
slate是一个项目,使它非常简单地使用PDFMiner从一个库:
>>> with open('example.pdf') as f:
... doc = slate.PDF(f)
...
>>> doc
[..., ..., ...]
>>> doc[1]
'Text from page 2...'
我已经使用pdftohtml与-xml参数,读取结果与subprocess.Popen(),这将给你x坐标,y坐标,宽度,高度和字体,在pdf中的每个文本片段。我认为这是'evince'可能也使用的,因为同样的错误消息喷吐出来。
如果您需要处理柱状数据,它会变得稍微复杂一些,因为您必须发明一种适合您的pdf文件的算法。问题在于,生成PDF文件的程序并不一定会以任何逻辑格式布局文本。你可以尝试简单的排序算法,它有时是有效的,但可能会有一些小的“散乱者”和“散乱者”,文本片段没有按照你认为的顺序排列。所以你必须要有创造力。
我花了大约5个小时才为我正在做的pdf文件找到一个。但它现在运行得很好。祝你好运。