2017-06-02 32 views
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中移出,以便提供覆盖支持。 (除非我只是创建一个副本,然后重命名,这是我想避免的。)

+0

在第一种情况下是否真的能够打开相同的文件来读取和写入'if not create_copy'? –

+0

@AndreasDeak当然不是。 – User1291

+0

我只能在这里猜测,但也许'addPage'并没有真正将页面复制到'new_pdf'中,而只是对原始文件的引用,然后该文件在'with'结尾处关闭。 –

回答

3

这是一种疯狂的猜测,因为我对模块不熟悉,也没有打扰到read the source code

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