2016-08-30 5 views
0

PdfFileMerger()をPyPDF2で使用して、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')でpdfsを開いていませんが、merge(pdfs_content_array)の配列にpdfsコンテンツを渡しています。その後、私は合併と私の出力を準備しています(生成されたファイルをローカルに保存したくないので、Mergedコンテンツをどこかに保存するために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を使用する前に、問題を解決するgetNumPages()メソッドを持つPdfFileWriterを使用しました。しかし、PdfFileWriterは、あまりにも多くのファイルを開いたときに問題を引き起こし、PdfFileMergerに移動したときにgetNumPages()などの同等のメソッドは使用できませんでした。 – arbitguy

+0

別のオプションが見つかりませんでした。ファイル 'merger.write(" output.pdf ")に書き込むのではなく、結果をBytesIOオブジェクトに書き込んでから、PdfFileWriterを使ってgetNumPages()を使って比較することができます。これが当てはまる場合は、出力をもう一度書き込んでからファイルに書き込むことができます。 –

関連する問題