将 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()
然后,使用pdfrw
的PdfWriter.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)
我目前正在为 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()
然后,使用pdfrw
的PdfWriter.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)