PyPDF2: чтение pdf из zip-файла - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь заставить PyPDF2 прочитать небольшой файл .pdf, который находится в простом zip-файле. Вот что у меня есть на данный момент:

import PyPDF2,zipfile

with zipfile.ZipFile("TEST.zip") as z:
    filename = z.namelist()[0]
    a = z.filelist[0]
    b = z.open(filename)
    c = z.read(filename)
    PyPDF2.PdfFileReader(b)

Сообщение об ошибке:

PdfReadWarning: PdfFileReader stream/file object is not in binary mode. It may not be read correctly. [pdf.py:1079]
io.UnsupportedOperation: seek

Любые идеи приветствуются! Спасибо.

1 Ответ

1 голос
/ 28 мая 2020

Файл еще не извлечен, поэтому вы не можете работать с ним с помощью open().

Это нормально, потому что PdfFileReader хочет поток; поэтому мы можем предоставить его, используя BytesIO . В приведенном ниже примере распакованные байты передаются в BytesIO, который превращает их в поток для PdfFileReader. Если вы не указали BytesIO, вы получите: AttributeError: 'bytes' object has no attribute 'seek'.

import PyPDF2,zipfile
from io import BytesIO                             

with zipfile.ZipFile('sample.zip','r') as z: 
    filename = z.namelist()[0] 
    pdf_file = PyPDF2.PdfFileReader(BytesIO(z.read(filename))) 

Результат:

In [20]: pdf_file
Out[20]: <PyPDF2.pdf.PdfFileReader at 0x7f01b61db2b0>

In [21]: pdf_file.getPage(0)
Out[21]: 
{'/Type': '/Page',
 '/Parent': {'/Type': '/Pages',
  '/Count': 2,
  '/Kids': [IndirectObject(4, 0), IndirectObject(6, 0)]},
 '/Resources': {'/Font': {'/F1': {'/Type': '/Font',
    '/Subtype': '/Type1',
    '/Name': '/F1',
    '/BaseFont': '/Helvetica',
    '/Encoding': '/WinAnsiEncoding'}},
  '/ProcSet': ['/PDF', '/Text']},
 '/MediaBox': [0, 0, 612, 792],
 '/Contents': {}}
...