为什么需要将读者和作者的陈述嵌套?

时间:2017-06-02 10:06:43

标签: python python-3.x file-io with-statement pypdf2

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,最终才能提供覆盖支持。 (除非我只是创建一个副本然后重命名,我有点想避免。)

1 个答案:

答案 0 :(得分:3)

这是一种疯狂的猜测,因为我不熟悉该模块而且没有费心去read the source code

但是,从文档中,PdfFileWriter.addPage似乎需要PageObject,它引用了该页面所属的PDF文件。所以我的猜测是addPage不会立即创建副本,而只是创建原始PDF中页面的引用,并且在编写新PDF之前关闭该文件时,该页面的内容为丢失。