Когда вы открываете файл с open(..., 'r', encoding='utf-8')
, вы в основном гарантируете, что это текстовый файл , не содержащий байтов, которые не являются UTF-8.Но, конечно, эта гарантия не распространяется на файл PDF - это двоичный формат, который может содержать или не содержать строк в UTF-8.Но это не так, как вы читаете.
Если у вас есть доступ к библиотеке, которая читает PDF и извлекает текстовые строки, вы могли бы сделать
# Dunno if such a library exists, but bear with ...
instance = myFantasyPDFlibrary('file.pdf')
for text_snippet in instance.enumerate_texts_in_PDF():
if 'API No.:\n' in text_snippet:
api = text_snippet.split('API No.:\n')[1].split('\n')[0].split('"')[0].strip()
более реалистично, но более пешеходноВы можете прочитать PDF-файл как двоичный файл и найти зашифрованный текст.
with open('file.pdf', 'rb') as pdf:
pdfbytes = pdf.read()
if b'API No.:\n' in pdfbytes:
api_text = pdfbytes.split(b'API No.:\n')[1].split(b'\n')[0].decode('utf-8')
api = api_text.split('"')[0].strip()
Необработанный обходной путь - врать Python о кодировке и утверждать, что на самом деле это Latin-1.Эта конкретная кодировка имеет привлекательную особенность, заключающуюся в том, что каждый байт отображается точно в свою собственную кодовую точку Unicode, поэтому вы можете читать двоичные данные в виде текста и получать от этого удовольствие.Но тогда, конечно, любой фактический UTF-8 будет преобразован в mojibake (поэтому "hëlló"
будет отображаться как "hëlló"
например).Вы можете извлечь фактический текст UTF-8, преобразовав текст обратно в байты, а затем расшифровав его с правильной кодировкой (latintext.encode('latin-1').decode('utf-8')
).