Как сохранить порядок ввода при преобразовании PDF в текст на Python? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь прочитать текст из PDF-файла.Этот файл является частью сгенерированного отчета.Я могу прочесть текст в файле, но он получается очень искаженным.В конечном итоге я хочу получить каждую строку в PDF-файле как элемент списка, но вы можете видеть, что имена полей и записи перепутаны.Пример 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 Ответ

1 голос
/ 10 мая 2019

Это просто объяснение, почему это происходит, а не решение.Но это слишком долго для комментария, поэтому он получил ответ ...

Причина этого странного порядка в том, что фрагменты текста в документе нарисованы в таком порядке.

Если вы покопаетесь в 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, я не могу сказать, предлагает ли эта библиотека разные методы извлечения текста, или вам нужно прибегнуть к другой библиотеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...