Почему этот код не может правильно извлекать текст Unicode из PDF-файлов? - PullRequest
0 голосов
/ 05 июня 2018

Я хочу извлечь текст, содержащийся в PDF.Это мой код для этого:

import textract

doc = textract.process(r"C:\path\to\the\downloaded.pdf", encoding = 'raw_unicode_escape')
f = open('pdf_to_text.txt','wb')
f.write(doc)

Это вывод:

\u53cb\u90a6\u4fdd\u96aa\u63a7\u80a1\u6709\u9650\u516c\u53f8

REAL LIFE
REAL IMPACT
A NNUA L REP ORT 2015

STOCK CODE : 1299

VISION & PURPOSE
Our Vision is to be the pre-eminent life
insurance provider in the Asia-Pacific region.
That is our service to our customers and
our shareholders.
Our Purpose is to play a leadership role in
driving economic and social development
across the region. That is our service to
societies and their people.

ABOUT AIA
AIA Group Limited and its subsidiaries (collectively \u201cAIA\u201d
or the \u201cGroup\u201d) comprise the largest independent publicly
listed pan-Asian life insurance group. It has a presence in
18 markets in Asia-Paci\ufb01c \u2013 wholly-owned branches and
subsidiaries in Hong Kong, Thailand, Singapore, Malaysia,
China, Korea, the Philippines, Australia, Indonesia, Taiwan,
... ...
... ...
... ...

Как видно, он читает некоторые «причудливые» тексты (unicode? Ascii?) правильно, но не все.Как это исправить?

Я перепробовал 5 схем кодирования - utf-8 дает плохие результаты, utf-16 дает худшие результаты, преобразуя все в неразборчивый текст, ascii дает неплохие результаты, нооставляет несколько символов, unicode_escape дает средние результаты, оставляя довольно много неразборчивых символов, а raw_unicode_escape также дает хорошие результаты, но оставляет несколько таких, как ascii.

Это ссылка наPDF, который я скачал на локальный диск для анализа:

https://www.aia.com/content/dam/group/en/docs/annual-report/aia-annual-report-2015-eng.pdf

PS Еще одна небольшая не связанная с этим проблема заключается в том, что временами сохраняются пробелы между буквами слова,как A NNUA L REP ORT в текстовом фрагменте выше.Как это можно исправить?

РЕДАКТИРОВАТЬ: Я нашел на страницах 10 и 11 документация textract о возможных вариантах схемы кодирования.Но их почти сотня:

Possible choices: aliases, ascii, base64_codec, big5, big5hkscs,
bz2_codec, charmap, cp037, cp1006, cp1026, cp1140, cp1250, cp1251,
cp1252, cp1253, cp1254, cp1255, cp1256, cp1257, cp1258, cp424,
cp437, cp500, cp720, cp737, cp775, cp850, cp852, cp855, cp856,
cp857, cp858, cp860, cp861, cp862, cp863, cp864, cp865, cp866,
cp869, cp874, cp875, cp932, cp949, cp950, euc_jis_2004, euc_jisx0213,
euc_jp, euc_kr, gb18030, gb2312, gbk, hex_codec, hp_roman8, hz,
idna, iso2022_jp, iso2022_jp_1, iso2022_jp_2, iso2022_jp_2004,
iso2022_jp_3, iso2022_jp_ext, iso2022_kr, iso8859_1, iso8859_10,
iso8859_11, iso8859_13, iso8859_14, iso8859_15, iso8859_16,
iso8859_2, iso8859_3, iso8859_4, iso8859_5, iso8859_6, iso8859_7,
iso8859_8, iso8859_9, johab, koi8_r, koi8_u, latin_1, mac_arabic,
mac_centeuro, mac_croatian, mac_cyrillic, mac_farsi, mac_greek,
mac_iceland, mac_latin2, mac_roman, mac_romanian, mac_turkish,
mbcs, palmos, ptcp154, punycode, quopri_codec, raw_unicode_escape,
rot_13, shift_jis, shift_jis_2004, shift_jisx0213, string_escape, tactis,
tis_620, undefined, unicode_escape, unicode_internal, utf_16, utf_16_be,
utf_16_le, utf_32, utf_32_be, utf_32_le, utf_7, utf_8, utf_8_sig, uu_codec,
zlib_codec

Как я могу определить, какой из них используется в этом конкретном PDF?А что, если даже это оставляет несколько персонажей?Или это правда, что одна из этих должна быть схемой кодирования , которая не оставляет после себя ни одного неразборчивого символа?

1 Ответ

0 голосов
/ 05 июня 2018

Вот так я и решил.Я использовал removegarbage функцию I , найденную здесь , чтобы заменить все не алфавитно-цифровые символы.

def removegarbage(str):
    # Replace one or more non-word (non-alphanumeric) chars with a space
    str = re.sub(r'\W+', ' ', str)
    str = str.lower()
    return str

doc = removegarbage(doc.decode('raw_unicode_escape'))

Если вы откроете текстовый файл в обычном текстовом редакторе (например, в блокноте), вы все равно увидите эти неразборчивые символы.Но если вы откроете его в консоли (или, возможно, даже в расширенном текстовом редакторе?), Вы увидите, что эти символы исчезли:

>>>print(doc)
'aia group limited 友邦保險控股有限公司 real life real impact a nnua l rep ort 
2015 stock code 1299 vision purpose our vision is to be the pre eminent life 
insurance provider in the asia pacific region that is our service to our 
customers and our shareholders our purpose is to play a leadership role in 
driving economic and social development across the region that is our 
service to societies and their people about aia aia group limited and its 
subsidiaries collectively aia or the group comprise the largest independent 
publicly listed pan asian life insurance group it has a presence in 18 
markets in asia pacific wholly owned branches and subsidiaries in hong kong 
thailand singapore malaysia china korea the philippines australia indonesia 
taiwan ... ... ...

Да, знаки препинания и заглавные буквы тоже пропали, но этохорошо, так как знаки препинания и заглавные буквы не имеют значения для того, что я собираюсь делать с этим извлеченным текстом.

...