Pdf Miner возвращает странные буквы/символы

Я использую pdfminer с python 3 и получаю странные буквы в тексте, восстановленном из pdf.

Например, я получаю significantвместо significant (обратите внимание, что буквы f и I объединены в одну).

Я понятия не имею, почему это происходит. Это код, который я использую.

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
from nltk.tokenize import sent_tokenize


def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    sentences = sent_tokenize(text)

    for s in sentences:
        print(s)
        print("\n\n")

Мое единственное предположение до сих пор заключается в том, что это может быть связано с кодировкой, но кажется, что невозможно получить кодировку pdf


person LBes    schedule 17.10.2018    source источник
comment
Вы проверили с помощью других средств, что текст в PDF-файле фактически хранится в виде отдельных символов, и что вы действительно получаете другие результаты от pdfminer, чем с помощью этих других средств?   -  person Random Davis    schedule 18.10.2018
comment
Основываясь на предыдущем комментарии,  – это обычная лигатура.   -  person Chris    schedule 18.10.2018
comment
@RandomDavis Я открывал несколько pdf-файлов в нескольких программах просмотра, и слово всегда было в порядке. Ctrl-F для значащих показывает слово.   -  person LBes    schedule 18.10.2018
comment
Потому что (1) это очень очень распространенная лигатура, известная многим (очевидно, всем вашим) нескольким зрителям, и/или (2) PDF-файл может содержать метаданные, которые явно заявляют, что правильный перевод глифа в определенном шрифте должен быть другой серией символов, и/или (3) любая строка в PDF может иметь прикрепленные метаданные, содержащие значение за строкой, в интересах поисковых систем, программ чтения с экрана и другого программного обеспечения.   -  person Jongware    schedule 18.10.2018
comment
@usr2564301 usr2564301 как избежать этой проблемы?   -  person LBes    schedule 18.10.2018
comment
Избегать? Нет, если вы не хотите изменить код pdfminer (что, в свою очередь, требует гораздо большего знания внутренней структуры PDF, чем у вас есть сейчас). Проще добавить в код одну строку для замены на fi. (Есть как минимум еще одна общая лигатура.)   -  person Jongware    schedule 18.10.2018
comment
@ usr2564301 действительно нужно больше знаний, чем у меня есть. Я рассмотрю другие возможные лигатуры в формате pdf, чтобы убедиться, что смогу определить большинство из них.   -  person LBes    schedule 18.10.2018


Ответы (1)


PDFminer работает корректно. Речь идет о символе Юникода U+FB01, лигатуре fi< /а>.

Добавьте строку для замены на fi в свой код:

for s in sentences:
    s = s.replace ('fi', 'fi')
    print (s)

Есть еще одна очень распространенная — и чисто типографская (*) — лигатура, определенная в Unicode: U+FB02, лигатура fl; относиться к этому так же:

    s = s.replace ('fl', 'fl')

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

(*) Не совершайте не ошибку, изменяя æ до ae и œ до oe . Это не «чисто типографские лигатуры», а действительные символы сами по себе.

person Jongware    schedule 17.10.2018
comment
Принято. Думал, что это можно обойти, но мне придется придерживаться этого и искать другие возможные лигатуры. - person LBes; 18.10.2018