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