2

我目前正在为 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变量使用PdfReader来自 pdfrw 库的对象。现在,当我们到达#<this point is crucial>标记时,我有一个filled_pdf变量,它是一个 PdfReader 对象。我想将它转换为一个文件流(一个字节数组,或者一个 io.BytesIO 对象,如果你愿意的话),并以这种形式返回它。我不想将其写入文件。但是,pdfrw (pdfrw.PdfWriter) 提供的编写器类不允许这样的操作。它只提供一种write(<filename>)方法,将 PdfReader 对象保存到 pdf 输出文件中。

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

请帮忙 :-(

4

1 回答 1

2

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

from io import BytesIO

new_bytes_object = BytesIO()

然后,使用pdfrw'sPdfWriter.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对象的行为类似于文件对象,也称为类文件对象。它和相关类的io.StringIO行为就像内存中的文件一样,例如使用下面f的内置函数创建的对象open

with open("output.txt", "a") as f:
    f.write(some_data)
于 2021-08-30T14:42:17.387 回答