如何让pypdf逐行读取页面内容?
我有一个PDF文件,每一页上都有一个地址。这些地址的格式是这样的:
Location Name
Street Address
City, State Zip
举个例子:
The Gift Store
620 Broadway Street
Van Buren, AR 72956
每个地址都是这个格式,而且每个地址都在PDF的不同页面上。
我需要提取这些地址信息,并把结果存储到一个Excel或CSV文件里。我希望每个信息字段都能单独分开。我的Excel表格需要有位置名称、街道地址、城市、州和邮政编码,每个信息都在不同的列里。我正在使用Python中的pyPdf库。
我用以下代码来实现这个功能,但我的代码没有考虑换行符,而是把整页的数据当作一个连续的字符串输出。
import pyPdf
def getPDFConten(path):
content = ""
num_pages = 10
p = file(path, "rb")
pdf = pyPdf.PdfFileReader(p)
for i in range(9, num_pages):
x = pdf.getPage(i).extractText()+'\n'
content += x
content = " ".join(content.replace(u"\xa0", " ").strip().split())
return content
con = getPDFContent("document.pdf")
print con
比如我的例子,它输出的是"The Gift Store 620 Broadway Street Van Buren, AR 72956"。
如果我能逐行读取输入,那我就可以很容易地从前两行中获取位置名称和街道地址,然后从第三行中获取其余的信息,使用子字符串来处理。
我尝试使用这里列出的解决方案(pyPdf忽略PDF文件中的换行符),但对我来说没有用。我也试过使用pdfminer:它可以逐行提取信息,但它首先把PDF转换成文本文件,而我不想这样。我只想使用pyPdf。有没有人能告诉我我哪里出错了,或者我缺少了什么?用pyPdf做到这一点可能吗?
1 个回答
3
你可以试试用 subprocess
来调用 pdftotext
,可能还要加上 -layout
这个选项,这个工具是 poppler 提供的。对我来说,这个方法比用 pypdf 要好很多。
比如,我用下面的代码从一个 PDF 文件中提取 CAS 号码:
import subprocess
import re
def findCAS(pdf, page=None):
'''Find all CAS numbers on the numbered page of a file.
Arguments:
pdf -- Name of the PDF file to search
page -- number of the page to search. if None, search all pages.
'''
if page == None:
args = ['pdftotext', '-layout', '-q', pdf, '-']
else:
args = ['pdftotext', '-f', str(page), '-l', str(page), '-layout',
'-q', pdf, '-']
txt = subprocess.check_output(args)
candidates = re.findall('\d{2,6}-\d{2}-\d{1}', txt)
checked = [x.lstrip('0') for x in candidates if checkCAS(x)]
return list(set(checked))
def checkCAS(cas):
'''Check if a string is a valid CAS number.
Arguments:
cas -- string to check
'''
nums = cas[::-1].replace('-', '') # all digits in reverse order
checksum = int(nums[0]) # first digit is the checksum
som = 0
# Checksum method from: http://nl.wikipedia.org/wiki/CAS-nummer
for n, d in enumerate(nums[1:]):
som += (n+1)*int(d)
return som % 10 == checksum