将 Python pdfrw PdfReader 对象写入字节数组/文件流

Writing a Python pdfrw PdfReader object to an array of bytes / filestream

我目前正在为 pdf 编辑器应用程序进行简单的概念验证。该示例应该是一个简化的 python 脚本,展示了我们如何使用 pdfrw 库来编辑带有表单的 PDF 文件。

那么,问题来了。 我对将编辑后的 ​​PDF 写入文件不感兴趣。 这个想法是文件打开和关闭很可能由外部代码处理,所以我希望文件中的所有编辑都在内存中完成。我不想将编辑后的文件流写入本地文件。

让我具体说明一下我的意思。我目前有一段这样的代码:

class FormFiller:

    def __fill_pdf__(input_pdf_filestream : bytes, data_dict : dict):
        template_pdf : pdfrw.PdfReader = pdfrw.PdfReader(input_pdf_filestream)
            # <some editing magic here>
        return template_pdf

    def fillForm(self,mapper : FieldMapper):
        value_mapping : dict = mapper.getValues()
        filled_pdf : pdfrw.PdfReader = self.__fill_pdf__(self.filesteam, value_mapping)
        #<this point is crucial>

    def __init__(self, filestream : bytes):
        self.filesteam : bytes = filestream

因此,如您所见,FormFiller 构造函数接收一个字节数组。事实上,它是一个 io.BytesIO 对象。 template_pdf 变量使用来自 pdfrw 库的 PdfReader 对象。现在,当我们到达 #<this point is crucial> 标记时,我有一个 filled_pdf 变量,它是一个 PdfReader 对象。我想将它转换为文件流(一个字节数组,或者一个 io.BytesIO 对象,如果你愿意的话),并以这种形式 return 它。 我不想将它写入文件。但是,pdfrw (pdfrw.PdfWriter) 提供的编写器class不允许这样的操作。它只提供了一个write(<filename>)方法,将PdfReader对象保存到pdf输出文件。

我应该如何处理这个问题?你推荐一个解决方法吗?或者也许我应该使用一个完全不同的库来完成这个?

请帮忙:-(

要将更改后的 PDF 保存到内存中可以传递的对象中(而不是写入文件),只需创建一个空实例 io.BytesIO:

from io import BytesIO

new_bytes_object = BytesIO()

然后,使用pdfrwPdfWriter.write()方法将数据写入空的BytesIO对象:

pdfrw.PdfWriter.write(new_bytes_object, filled_pdf)
# I'm not sure about the syntax, I haven't used this lib before

这是有效的,因为 io.BytesIO 对象的行为类似于下面的 file object, also known as a file-like object. It and related classes like io.StringIO behave like files in memory, such as the object f created with the built-in function open

with open("output.txt", "a") as f:
    f.write(some_data)