0
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,以便提供覆盖支持。(除非我只是创建一个副本然后重命名,我有点想避免这种情况。)

4

1 回答 1

3

这是一种疯狂的猜测,因为我不熟悉该模块,也没有费心阅读源代码

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

于 2017-06-02T11:22:05.287 回答