我有一个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”。
如果我可以逐行读取输入,那么我可以使用子串轻松地从前两行获取位置名称和Stree地址,其余来自第三行。
我尝试使用列出的解决方案[here(pyPdf ignores newlines in PDF file),但它对我不起作用。我也尝试使用pdfminer:它可以逐行提取信息,但它首先将pdf转换为文本文件,我不想这样做。我想这样做只使用pyPdf。任何人都可以建议我错在哪里或我错过了什么?这可以用pyPdf吗?
答案 0 :(得分:3)
您可以尝试使用subprocess
从poppler实用程序中调用pdftotext
(可能使用-layout
选项)。对我来说,它比使用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