Конвертировать / записать PDF в RAM как файлоподобный объект для дальнейшей работы с ним - PullRequest
1 голос
/ 07 июля 2019

Мой скрипт генерирует PDF (PyPDF2.pdf.PdfFileWriter object) и сохраняет его в переменной. Мне нужно работать с ним как file-like object далее в сценарии. Но теперь я должен сначала записать его на HDD Затем я должен открыть его как файл для работы с ним.

Чтобы предотвратить это ненужные операции записи / чтения, я нашел много решений - StringIO, BytesIO и так далее. Но я не могу найти, что именно может помочь мне в моем случае.

Насколько я понимаю - мне нужно "преобразовать" (или записать в ОЗУ) PyPDF2.pdf.PdfFileWriter object в file-like object, чтобы работать непосредственно с ним.

Или есть другой метод, который точно соответствует моему случаю?

ОБНОВЛЕНИЕ - вот пример кода

from pdfrw import PdfReader, PdfWriter, PageMerge
from PyPDF2 import PdfFileReader, PdfFileWriter


red_file = PdfFileReader(open("file_name.pdf", 'rb'))

large_pages_indexes = [1, 7, 9]

large = PdfFileWriter()
for i in large_pages_indexes:
    p = red_file.getPage(i)
    large.addPage(p)

# here final data have to be written (I would like to avoid that)
with open("virtual_file.pdf", 'wb') as tmp:
  large.write(tmp)

# here I need to read exported "virtual_file.pdf" (I would like to avoid that too)
with open("virtual_file.pdf", 'rb') as tmp:
  pdf = PdfReader(tmp) # here I'm starting to work with this file using another module "pdfrw"
  print(pdf)

1 Ответ

2 голосов
/ 07 июля 2019

Во избежание медленного дискового ввода-вывода, кажется, вы хотите заменить

with open("virtual_file.pdf", 'wb') as tmp:
  large.write(tmp)

with open("virtual_file.pdf", 'rb') as tmp:
  pdf = PdfReader(tmp)

на

buf = io.BytesIO()
large.write(buf)
buf.seek(0)
pdf = PdfReader(buf)

Также вам доступен buf.getvalue().

...