Python3 PyPDF2 - как рассматривать обработчики файлов как объекты BytesIO? - PullRequest
0 голосов
/ 03 января 2019

Иметь хороший, проверенный фрагмент кода PyPDF2 на Python .py, предназначенного для работы с «настоящими» файлами ОС. Отладив все это, я сейчас пытаюсь включить его в функцию plPython, заменив файлы на io.BytesIO () - или любой другой механизм, который будет наилучшим кандидатом для бесшовной вставки ...

Файл для чтения / записи теперь будет в столбцах PostgreSQL. Документы «in» были записаны с использованием функций копирования PG - количество байтов соответствует размеру диска; пока все хорошо.

Исходный код ожидаемых файлов:

# infile = "myInputPdf.pdf"
# outfile = "myOutputPdf.pdf"

# inputStream  = open(infile, "rb")  # designed to open OS-based file
# --- Instead: 'document_in' loaded from PG bytea col:
inputStream = io.BytesIO(document_in)
# ---
pdf_reader = PdfFileReader(inputStream, strict=False)
# (lots of code in here, seems? to be working)
outputStream = io.BytesIO()   # trying it the python3 way!
pdf_writer.write(outputStream)

(я предположил, что объекты должны рассматриваться как объекты байтов)

Наконец:

plan3 = plpy.prepare("UPDATE documents SET document_out=$2 WHERE name=$1", ["varchar"]["varchar"])
ERROR:  TypeError: list indices must be integers, not str

(PostgreSQL 11.1, если это имеет значение)

делали подобные вещи в прошлом, используя техники mkstemp; сейчас пытаюсь вырасти в мир байтов!

1 Ответ

0 голосов
/ 03 января 2019

Второй аргумент в plpy.prepare() - это список.Тип столбца bytea, а не varchar.И вы должны использовать bytes (не файловый объект), чтобы обновить столбец:

plan3 = plpy.prepare("UPDATE documents SET document_out=$2 WHERE name=$1", ["varchar", "bytea"])
outputStream.seek(0)
bytes_out = outputStream.read()
plpy.execute(plan3, ['some name', bytes_out])
...