是否有任何python模块转换PDF文件为文本?我尝试了在Activestate中发现的一段代码,它使用pypdf,但生成的文本之间没有空格,没有任何用处。
当前回答
pyPDF工作正常(假设您使用的是格式良好的pdf)。如果你想要的只是文本(带空格),你可以这样做:
import pyPdf
pdf = pyPdf.PdfFileReader(open(filename, "rb"))
for page in pdf.pages:
print page.extractText()
您还可以轻松地访问元数据、图像数据等。
extractText代码中的注释指出:
定位所有文本绘图命令,在 方法中提供的顺序 内容流,并提取文本。 这适用于一些PDF文件, 但对其他人来说很糟糕,这取决于 发电机使用。这将是 未来精致。不要依赖 文字的顺序 函数,因为它会改变如果这个 功能变得更加复杂。
这是否是一个问题取决于你对文本所做的事情(例如,如果顺序不重要,这很好,或者如果生成器按照它将显示的顺序将文本添加到流中,这很好)。我有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编写的,请参阅下面我的评论。
slate是一个项目,使它非常简单地使用PDFMiner从一个库:
>>> with open('example.pdf') as f:
... doc = slate.PDF(f)
...
>>> doc
[..., ..., ...]
>>> doc[1]
'Text from page 2...'
pyPDF工作正常(假设您使用的是格式良好的pdf)。如果你想要的只是文本(带空格),你可以这样做:
import pyPdf
pdf = pyPdf.PdfFileReader(open(filename, "rb"))
for page in pdf.pages:
print page.extractText()
您还可以轻松地访问元数据、图像数据等。
extractText代码中的注释指出:
定位所有文本绘图命令,在 方法中提供的顺序 内容流,并提取文本。 这适用于一些PDF文件, 但对其他人来说很糟糕,这取决于 发电机使用。这将是 未来精致。不要依赖 文字的顺序 函数,因为它会改变如果这个 功能变得更加复杂。
这是否是一个问题取决于你对文本所做的事情(例如,如果顺序不重要,这很好,或者如果生成器按照它将显示的顺序将文本添加到流中,这很好)。我有pyPdf提取代码在日常使用中,没有任何问题。
我已经使用pdftohtml与-xml参数,读取结果与subprocess.Popen(),这将给你x坐标,y坐标,宽度,高度和字体,在pdf中的每个文本片段。我认为这是'evince'可能也使用的,因为同样的错误消息喷吐出来。
如果您需要处理柱状数据,它会变得稍微复杂一些,因为您必须发明一种适合您的pdf文件的算法。问题在于,生成PDF文件的程序并不一定会以任何逻辑格式布局文本。你可以尝试简单的排序算法,它有时是有效的,但可能会有一些小的“散乱者”和“散乱者”,文本片段没有按照你认为的顺序排列。所以你必须要有创造力。
我花了大约5个小时才为我正在做的pdf文件找到一个。但它现在运行得很好。祝你好运。
推荐文章
- 如何在交互式Python中查看整个命令历史?
- 如何显示有两个小数点后的浮点数?
- 如何用OpenCV2.0和Python2.6调整图像大小
- 在每个列表元素上调用int()函数?
- 当使用代码存储库时,如何引用资源的相对路径
- 如何在Flask-SQLAlchemy中按id删除记录
- 在Python中插入列表的第一个位置
- Python Pandas只合并某些列
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?