是否有任何python模块转换PDF文件为文本?我尝试了在Activestate中发现的一段代码,它使用pypdf,但生成的文本之间没有空格,没有任何用处。
当前回答
Pdftotext一个开源程序(Xpdf的一部分),你可以从python调用它(不是你想要的,但可能有用)。我用过没有问题。我认为谷歌在谷歌桌面使用它。
其他回答
你也可以很容易地使用pdfminer作为一个库。您可以访问pdf的内容模型,并可以创建自己的文本提取。我这样做是为了将pdf内容转换为分号分隔的文本,使用下面的代码。
该函数只是根据TextItem内容对象的y坐标和x坐标对其进行排序,并输出具有相同y坐标的项作为一个文本行,并用';'字符分隔同一行上的对象。
使用这种方法,我能够从pdf中提取文本,而其他任何工具都无法从中提取适合进一步解析的内容。我尝试过的其他工具包括pdftotext、ps2ascii和在线工具pdftextonline.com。
Pdfminer是一个非常宝贵的pdf抓取工具。
def pdf_to_csv(filename):
from pdflib.page import TextItem, TextConverter
from pdflib.pdfparser import PDFDocument, PDFParser
from pdflib.pdfinterp import PDFResourceManager, PDFPageInterpreter
class CsvConverter(TextConverter):
def __init__(self, *args, **kwargs):
TextConverter.__init__(self, *args, **kwargs)
def end_page(self, i):
from collections import defaultdict
lines = defaultdict(lambda : {})
for child in self.cur_item.objs:
if isinstance(child, TextItem):
(_,_,x,y) = child.bbox
line = lines[int(-y)]
line[x] = child.text
for y in sorted(lines.keys()):
line = lines[y]
self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
self.outfp.write("\n")
# ... the following part of the code is a remix of the
# convert() function in the pdfminer/tools/pdf2text module
rsrc = PDFResourceManager()
outfp = StringIO()
device = CsvConverter(rsrc, outfp, "ascii")
doc = PDFDocument()
fp = open(filename, 'rb')
parser = PDFParser(doc, fp)
doc.initialize('')
interpreter = PDFPageInterpreter(rsrc, device)
for i, page in enumerate(doc.get_pages()):
outfp.write("START PAGE %d\n" % i)
interpreter.process_page(page)
outfp.write("END PAGE %d\n" % i)
device.close()
fp.close()
return outfp.getvalue()
更新:
上面的代码是针对旧版本的API编写的,请参阅下面我的评论。
今天找到了解决方案。对我来说很好。甚至将PDF页面转换为PNG图像。 http://www.swftools.org/gfx_tutorial.html
由于这些解决方案都不支持最新版本的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])
我需要在python模块中将特定的PDF转换为纯文本。我使用PDFMiner 20110515,在阅读了他们的pdf2txt.py工具后,我写了这个简单的片段:
from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
def to_txt(pdf_path):
input_ = file(pdf_path, 'rb')
output = StringIO()
manager = PDFResourceManager()
converter = TextConverter(manager, output, laparams=LAParams())
process_pdf(manager, converter, input_)
return output.getvalue()
PDFminer给了我也许一行[第1页7…在我尝试使用它的pdf文件的每一页上。
到目前为止,我有最好的答案是pdftopipe,或者是基于Xpdf的c++代码。
请参阅我的问题,了解pdftopipe的输出是什么样的。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录