为什么需要嵌套 reader 和 writer 的 with 语句?
Why need with statements for reader and writer be nested?
with open(pdf,'rb') as fin:
reader = PyPDF2.PdfFileReader(fin)
new_pdf = PyPDF2.PdfFileWriter()
for i in range(reader.numPages):
new_pdf.addPage(reader.getPage(i))
out_file = pdf if not create_copy else self._new_copy(pdf)
with open(out_file,'wb') as fout:
new_pdf.write(fout)
这在编写副本时按预期工作。
现在让我们将最后三行移出 with
:
with open(pdf,'rb') as fin:
reader = PyPDF2.PdfFileReader(fin)
new_pdf = PyPDF2.PdfFileWriter()
for i in range(reader.numPages):
new_pdf.addPage(reader.getPage(i))
out_file = pdf if not create_copy else self._new_copy(pdf)
with open(out_file,'wb') as fout:
new_pdf.write(fout)
这会创建一个页数正确的 pdf,但是所有页面都是空白的,甚至写入新文件时. (请注意,将 new_pdf = ...
移出也不会改变任何内容)
为什么?我能做些什么呢?因为我希望最终必须将这三行移出第一行 with
,以便提供覆盖支持。 (除非我只是创建一个副本然后重命名,我有点想避免这种情况。)
这是一个大胆的猜测,因为我不熟悉这个模块,也懒得去 read the source code。
但是,从文档来看,似乎 PdfFileWriter.addPage
expects a PageObject
引用了该页面所属的 PDF 文件。所以我的猜测是 addPage
不会立即创建副本,而只是对原始 PDF 中页面的引用,并且在写入新 PDF 之前关闭该文件时,该页面的内容是迷路了。
with open(pdf,'rb') as fin:
reader = PyPDF2.PdfFileReader(fin)
new_pdf = PyPDF2.PdfFileWriter()
for i in range(reader.numPages):
new_pdf.addPage(reader.getPage(i))
out_file = pdf if not create_copy else self._new_copy(pdf)
with open(out_file,'wb') as fout:
new_pdf.write(fout)
这在编写副本时按预期工作。
现在让我们将最后三行移出 with
:
with open(pdf,'rb') as fin:
reader = PyPDF2.PdfFileReader(fin)
new_pdf = PyPDF2.PdfFileWriter()
for i in range(reader.numPages):
new_pdf.addPage(reader.getPage(i))
out_file = pdf if not create_copy else self._new_copy(pdf)
with open(out_file,'wb') as fout:
new_pdf.write(fout)
这会创建一个页数正确的 pdf,但是所有页面都是空白的,甚至写入新文件时. (请注意,将 new_pdf = ...
移出也不会改变任何内容)
为什么?我能做些什么呢?因为我希望最终必须将这三行移出第一行 with
,以便提供覆盖支持。 (除非我只是创建一个副本然后重命名,我有点想避免这种情况。)
这是一个大胆的猜测,因为我不熟悉这个模块,也懒得去 read the source code。
但是,从文档来看,似乎 PdfFileWriter.addPage
expects a PageObject
引用了该页面所属的 PDF 文件。所以我的猜测是 addPage
不会立即创建副本,而只是对原始 PDF 中页面的引用,并且在写入新 PDF 之前关闭该文件时,该页面的内容是迷路了。