问题:和 和
有什么不一样?它们似乎(有时)产生不同的输出。open(<name>, "w", encoding=<encoding>)
open(<name>, "wb") + str.encode(<encoding>)
上下文:
在使用PyFPDF(版本 1.7.2)时,我对类进行了子FPDF
类化,除其他外,添加了我自己的输出方法(获取pathlib.Path
对象)。在查看原始FPDF.output()
方法的来源时,我注意到几乎所有这些都是参数解析 - 唯一相关的位是
#Finish document if necessary
if(self.state < 3):
self.close()
[...]
f=open(name,'wb')
if(not f):
self.error('Unable to create output file: '+name)
if PY3K:
# manage binary data as latin1 until PEP461 or similar is implemented
f.write(self.buffer.encode("latin1"))
else:
f.write(self.buffer)
f.close()
看到这一点,我自己的实现看起来像这样:
def write_file(self, file: Path) -> None:
if self.state < 3:
# See FPDF.output()
self.close()
file.write_text(self.buffer, "latin1", "strict")
这似乎有效 - 在指定路径创建了一个 .pdf 文件,然后 chrome 打开了它。但它完全是空白的,即使我添加了图像和文本。经过数小时的试验,我终于找到了一个有效的版本(产生了一个非空的 pdf 文件):
def write_file(self, file: Path) -> None:
if self.state < 3:
# See FPDF.output()
self.close()
# using .write_text(self.buffer, "latin1", "strict") DOES NOT WORK AND I DON'T KNOW WHY
file.write_bytes(self.buffer.encode("latin1", "strict"))
查看pathlib.Path
源代码,它io.open
用于Path.write_text()
. 由于所有这些都是 Python 3.8,io.open
并且构建open()
是相同的.
注意:
FPDF.buffer
是 类型str
,但包含二进制数据(pdf 文件)。可能是因为该库最初是为 Python 2 编写的。