在pdf中将pdf转换为文本时,如何保留输入顺序?

时间:2019-04-26 17:01:08

标签: python pdf text pypdf2

我正在尝试从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:

这种混淆在整个文档中都会发生。

1 个答案:

答案 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,所以我不能说这个库是否提供了不同的文本提取方法供您参考,或者您是否必须求助于其他库。