2016-08-30 124 views
0

我想在PyPDF2中使用PdfFileMerger()来合并pdf文件(参见代码)。在pypdf2中使用PdfFileMerger()后的页面计数

from PyPDF2 import PdfFileMerger, PdfFileReader 

[...] 

merger = PdfFileMerger() 

if (some condition): 
    merger.append(PdfFileReader(file(filename1, 'rb'))) 
    merger.append(PdfFileReader(file(filename2, 'rb'))) 
if (test for non-zero file size): 
    merger.write("output.pdf") 

但是,我的合并命令受到一定的条件,它可能会导致没有生成合并的PDF文件。我想知道如何在使用PdfFileMerger()执行合并之后确定页数。如果没有别的,我想知道如果页面数量是非零。维护柜台这样做会很麻烦,因为我正在执行跨越多个功能的合并,并且更喜欢更优雅的解决方案。

+0

可能创建一个在你并购的对象,它保持页数的包装,并通过周围。 –

+0

是的,那是一个选项。与PdfFileWriter不同,PdfFileMerger似乎没有像getNumPages()这样的方法,似乎我们必须创建一个包装对象来实现此功能。 – arbitguy

回答

1

我是+ - 和你一样。我会解释我的解决方案。我不打开与PdfFileReader('filename.pdf', 'rb')的PDF文件,但我将pdfs内容传递给数组进行合并(pdfs_content_array)。然后,我正在准备合并和输出(不想在本地保存生成的文件,因此我必须使用BytesIO将合并的内容保存到某处),需要calc_page_sum来比较页码结果。最重要的部分是:calc_page_sum += PdfFileReader(bytes_content).getNumPages()所以我用PdfFileReader打开字节内容并获取页码。然后我追加合并... merger.append,bytes_content我正在写合并到我的字节输出并将其与calc_page_sum进行比较。而已。

from PyPDF2 import PdfFileMerger, PdfFileReader 
import io 

[...] 

def merge_the_pdfs(self,pdfs_content_array,output_file): 
    merger = PdfFileMerger() 
    output = io.BytesIO() 
    calc_page_sum = 0 

    for content in pdfs_content_array: 
     bytes_content = io.BytesIO(content) 
     calc_page_sum += PdfFileReader(bytes_content).getNumPages() 
     yield self.application.cpupool.submit(merger.append,bytes_content) 

    merger.write(output) 
    if not calc_page_sum == PdfFileReader(output).getNumPages(): 
     return None 

    return output.getValue() 

希望这会有所帮助!

第二个版本:

from PyPDF2 import PdfFileMerger, PdfFileReader 
import io 
import sys 

filename1 = 'test.pdf' 
filename2 = 'test1.pdf' 

merger = PdfFileMerger() 
output = io.BytesIO() 
calc_page_sum = 0 

filesarray = [filename1,filename2] 

for singlefile in filesarray: 
    calc_page_sum += PdfFileReader(singlefile, 'rb').getNumPages() 
    merger.append(PdfFileReader(singlefile, 'rb')) 

merger.write(output) 
print(calc_page_sum) 
print(PdfFileReader(output).getNumPages()) 

if calc_page_sum == PdfFileReader(output).getNumPages(): 
    print("It worked") 
    merger.write("merging-test.pdf") 
    sys.exit() 

print("Didn't worked") 
sys.exit() 
+0

正如我的问题所述,我同意维护一个计数器(如calc_page_sum)可以解决这个问题。但是,我想知道是否有更好的解决方案。例如,在使用PdfFileMerger之前,我使用了PdfFileWriter,它有一个解决问题的getNumPages()方法。但是,当打开太多文件并且当我移动到PdfF​​ileMerger时,PdfFileWriter会导致问题,但像getNumPages()这样的等效方法不可用。 – arbitguy

+0

我没有找到其他选项。您可以将结果写入BytesIO对象,而不是写入文件'merger.write(“output.pdf”)',然后使用PdfFileWriter来使用getNumPages()并进行比较。如果这是真的,你可以再次写入输出,但然后写入文件。 –

相关问题