我正在尝试从pdf文件中读取文本。该文件是生成的报告的一部分。我正在阅读文件中的文本,但是结果非常乱码。我想要的是最终将pdf文件中的每一行作为列表中的一项获得,但是您可以看到字段名称和条目混合在一起了。可以找到here来查找我想要的pdf示例,下面是我尝试用来获取行的代码。
import PyPDF2
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
filename = 'U:/PLAN/BCUBRICH/Python/Network Plan/Page 1 from AMP380_1741500.pdf'
def getPDFContent(filename):
content = ""
p = open(filename, "rb")
pdf = PyPDF2.PdfFileReader(p)
pdf.
num_pages = pdf.getNumPages()
for i in range(0, num_pages):
content += pdf.getPage(i).extractText()+'\n'
# content = " ".join(content.replace(u"\xa0", " ").strip().split())
return content
content=getPDFContent(filename)
这是我得到的输出:
Out:'''UNITED STATES ENVIRONMENTAL PROTECTION AGENCYAIR QUALITY SYSTEMSITE DESCRIPTION REPORTApr. 25, 2019Site ID: 49-003-0003
Site Name: Brigham City
Local ID: BR
140 W.FISHBURN DRIVE, BRIGHAM CITY, UTStreet Address: City: Brigham City
Utah Zip Code: 84302
State: Box ElderCounty: Monitoring PointLocation Description: SuburbanLocation Setting: Interpolation-MapColl. Method:ResidentialLand Use: 20000819Date Established: Date Terminated: 20190130Last Updated: HQ Eval. Date:Regional Eval. Date: UtahAQCR : Ogden-Clearfield, UTCBSA: Salt Lake City-Provo-Orem, UTCSA: Met. Site ID:Direct Met Site: On-Site Met EquipType Met Site: Dist to Met. Site(m): Local Region: Urban Area: Not in an urban area
EPA Region: Denver
17411City Population: Dir. to CBD: Dist. to City(km): 3000Census Block: 3Block Group: 960701Census Tract: 1Congressional District: Class 1 Area: +41.492707Site Latitude: -112.018863Site Longitude: MountainTime Zone: UTM Zone: UTM Northing: UTM Easting: Accuracy: 60.73
Datum: WGS84
Scale: 24000
Point/Line/Area: Point 1,334.0Vertical Measure(m): 0Vert Accuracy: UnknownVert Datum : Vert Method: Unknown
Owning Agency: 1113 Utah Department Of Environmental Quality SITE COMMENTS SITE FOR OZONE, PM2.5, AND MET ACTIVE MONITOR TYPES Primary Monitor Periods # of Parameter Code Poc Begin Date End Date Monitor Type Monitors 42602 1 20180126 OTHER 2 44201 1 20010501 SLAMS 16 88101 1 20000819 20141231 88101 1 20160101 20161231 88101 1 20180101 88101 3 20170101 20171231 88101 4 20150101 20151231 TANGENT ROADS Road Traffic Traffic Compass Number Road Name Count Year Traffic Volume Source Road Type Sector 1 FISHBURN DRIVE 450 2000 LOCAL ST OR HY S Page 1 of 77
'''
例如,我希望列表中的第八项为
State: Utah Zip Code: 84302 County: Box Elder
但是我得到的是
Utah Zip Code: 84302 State: Box ElderCounty:
这种混淆在整个文档中都会发生。
答案 0 :(得分:1)
这仅是为什么会发生这种情况的说明,而不是解决方案。但是评论太久了,所以得到了答案...
之所以采用这种奇怪的顺序,是因为该文档中的文本块按该顺序绘制。
如果您深入研究PDF并查看内容流,则会发现此段与您选择的示例行有关:
/TD <</MCID 12 >>BDC
-47.25 -1.685 Td
(Utah )Tj
28.125 0 Td
[(Zip Code: )-190(84302)]TJ
-32.06 -0 Td
(State: )Tj
EMC
/TD <</MCID 13 >>BDC
56.81 0 Td
(Box Elder)Tj
-5.625 0 Td
(County: )Tj
EMC
您可能不理解说明,但是可以看到字符串(在圆括号(
... )
中)完全按照您在输出中观察到的顺序排列
犹他州邮政编码:84302省:Box ElderCounty:
而不是所需的
州:犹他州邮政编码:84302县:Box Elder
中间的 Td 指令使文本插入点来回跳转,以在查看器中获得不同的外观。
显然,您的文本提取方法仅按绘制顺序从内容流中检索字符串,而忽略绘制它们的实际位置。因此,为了正确提取文本,您必须更改使用的方法。因为我本人并不真正了解PyPDF2,所以我不能说这个库是否提供了不同的文本提取方法供您参考,或者您是否必须求助于其他库。