Скачайте pdf и передайте как объект файла для извлечения данных - PullRequest
0 голосов
/ 21 февраля 2020

Я использую следующий код для извлечения данных из локального файла PDF:

from pdfminer.high_level import extract_text

text = extract_text("fw9.pdf") 
print(text.encode("utf-8"))

Пример вывода:

b "Форма W-9 \ n \ n ( Rev. October 2018) \ nОтдел казначейства \ nНалоговая служба \ n \ nПросьба к налогоплательщику \ n \ nИдентификационный номер и свидетельство \ n \ nДать форму \ nвопросу. Не отправляйте \ n в IRS. \ N \ n1 Имя (как показано в вашей налоговой декларации). В этой строке необходимо указать имя; не оставляйте эту строку пустой. \ n \ n \ xe2 \ x96 \ xb6 Go до www.irs.gov/FormW9 для получения инструкций и последней информации. \ n \ n2 Название компании / неучтенное имя организации, если оно отличается от указанного выше \ n \ n3 Установите соответствующий флажок для классификации федерального налога для лица, имя которого указано в строке 1. Установите только один из \ n \ n следующих семи полей. \ n \ n Индивидуальный / индивидуальный предприниматель или \ nsingle-member LLC \ n \ n C Corporation \ n \ nS Corporation \ n \ nПартнерство \ n \ nНадежный / имущественный \ n \ n4 Исключения (коды применяются только к \ n определенным лицам, а не к физическим лицам; см. \ nnstructions на стр. 3): \ n \ nУдаленный получатель платежа де (если есть) \ n \ nОбязательство с ограниченной ответственностью.

И это прекрасно работает. Тем не менее, я хотел бы получить тот же файл из URL без сохранения на диск и перейти к той же функции, как показано:

from requests import get
from pdfminer.high_level import extract_text

url = 'https://www.irs.gov/pub/irs-pdf/fw9.pdf'
response = get(url)
text = extract_text(response.content) 
print(text.encode("utf-8"))

Я получаю следующую ошибку:

Трассировка (последний вызов был последним): файл "c: \ Users \ xxxxxxx \ get-file-from-url.py", строка 8, в text = extract_text (response.content) ) Файл "c: \ Users \ xxxxxxx \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ sitepackages \ pdfminer \ high_level.py", строка 107, в extract_text с открытым (pdf_file, "rb") значением fp, StringIO () as output_string: UnicodeDecodeError: код 'utf-8' c не может декодировать байт 0xe2 в позиции 10: недопустимый байт продолжения

Вот код функции из pdfminer :

def extract_text(pdf_file, password='', page_numbers=None, maxpages=0,
                 caching=True, codec='utf-8', laparams=None):
    """Parse and return the text contained in a PDF file.

    :param pdf_file: Path to the PDF file to be worked on
    :param password: For encrypted PDFs, the password to decrypt.
    :param page_numbers: List of zero-indexed page numbers to extract.
    :param maxpages: The maximum number of pages to parse
    :param caching: If resources should be cached
    :param codec: Text decoding codec
    :param laparams: An LAParams object from pdfminer.layout. If None, uses
        some default settings that often work well.
    :return: a string containing all of the text extracted.
    """
    if laparams is None:
        laparams = LAParams()

    with open(pdf_file, "rb") as fp, StringIO() as output_string:
        rsrcmgr = PDFResourceManager()
        device = TextConverter(rsrcmgr, output_string, codec=codec,
                               laparams=laparams)
        interpreter = PDFPageInterpreter(rsrcmgr, device)

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

        return output_string.getvalue()

Я искал в SO уже несколько дней и пробовал несколько вариантов, которые, к сожалению, не работали.

...