Не удается прочитать содержимое определенной страницы файла PDF, доступного в Интернете
Я использовал библиотеку PyMuPDF для локального анализа содержимого любой конкретной страницы PDF-файла и обнаружил, что он работает. Однако, когда я пытаюсь применить ту же логику при анализе содержимого любой конкретной страницы PDF-файла, доступного в Интернете, я сталкиваюсь с ошибкой.
Я добился успеха, используя следующий скрипт (локальный pdf):
import fitz
path = r'C:\Users\WCS\Desktop\pymupdf\Regular Expressions Cookbook.pdf'
doc = fitz.open(path)
page1 = doc.loadPage(5)
page1text = page1.getText("text")
print(page1text)
Сценарий ниже выдает ошибку (PDF, который доступен онлайн):
import fitz
import requests
URL = 'https://buildmedia.readthedocs.org/media/pdf/pdfminer-docs/latest/pdfminer-docs.pdf'
res = requests.get(URL)
doc = fitz.open(res.content)
page1 = doc.loadPage(5)
page1text = page1.getText("text")
print(page1text)
Ошибка, с которой сталкивается скрипт:
Traceback (most recent call last):
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\general_demo.py", line 8, in <module>
doc = fitz.open(res.content)
File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\fitz\fitz.py", line 2010, in __init__
_fitz.Document_swiginit(self, _fitz.new_Document(filename, stream, filetype, rect, width, height, fontsize))
RuntimeError: cannot open b'%PDF-1.5\n%\xd0\xd4\xc5\xd8\n1 0 obj\n<<\n/Length 843 \n/Filter /FlateDecode\n>>\nstream\nx\xdamUMo\xe20\x10\xbd\xe7Wx\x0f\x95\xda\x03\xc5N\xc8W\x85\x90\x9c\x84H\x1c\xb6\xad\nZ\xed\x95&\xa6\x8bT\x12\x14\xe0\xd0\x7f\xbf~3\x13\xda\xae\xf
Как я могу читать контент прямо из онлайн?
2 ответа
Решение
Похоже, вам нужно инициализировать объект с stream
:
>>> # from memory
>>> doc = fitz.open(stream=mem_area, filetype="pdf")
mem_area
имеет данные документа.
Я думаю, вам не хватало функции read() для чтения файла как bytesIO, который затем может использовать pymupdf.
with fitz.open(stream=uploaded_pdf.read(), filetype="pdf") as doc:
text = ""
for page in doc:
text += page.getText()
print(text)