我希望从pdf导出文本作为字符串列表,其中列表是整个文档,字符串是PDF的页面。我正在使用PDFMiner完成这项任务,但它非常复杂,我的时间紧迫。
到目前为止,我已经获得了将完整的pdf提取为字符串的代码,但我需要以字符串列表的形式提供它。
我的代码如下
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO
f = file('./PDF/' + file_name, 'rb')
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(pdf):
interpreter.process_page(page)
data = retstr.getvalue()
print data
请帮忙。
答案 0 :(得分:4)
当前脚本的问题是StringIO.getvalue
始终返回一个字符串,此字符串包含到目前为止读取的所有数据。此外,对于每个页面,您都会覆盖您存储它的变量data
。
一个解决方法是在写入之前存储StringIO
的位置,然后从该位置读取到字符串流的末尾:
# A list for all each page's text
pages_text = []
for page in PDFPage.get_pages(pdf):
# Get (and store) the "cursor" position of stream before reading from PDF
# On the first page, this will be zero
read_position = retstr.tell()
# Read PDF page, write text into stream
interpreter.process_page(page)
# Move the "cursor" to the position stored
retstr.seek(read_position, 0)
# Read the text (from the "cursor" to the end)
page_text = retstr.read()
# Add this page's text to a convenient list
pages_text.append(page_text)
将StringIO
视为文本文档。您需要在添加文本时管理光标位置,并将新添加的文本一次存储一页。在这里,我们将文本存储在列表中。