2017-03-22 12 views
8

PyPdf2は同じ名前のブックマークをいくつかネストしようとすると考慮しません。私は(あなたがそれをテストするために作業フォルダに、a、b及びcという名前の3つのPDFファイルを持っている時に必要)何を意味するかをテストするための自己完結型のpythonコードの下 同じ名前のPyPdf2ネストされたブックマークが動作しない

from PyPDF2 import PdfFileReader, PdfFileMerger 

def main(): 

merger = PdfFileMerger() 
pagenum = 0 
firstOne = True 
for file in ["a.pdf","b.pdf","c.pdf"]: 
    print("next row") 
    pdf = PdfFileReader(open(file,"rb")) 
    merger.append(pdf) 
    if firstOne: 
     child = merger.addBookmark(title="blabla",pagenum=1) 
     firstOne = False 
    else: 
     child = merger.addBookmark(title="blabla",pagenum=1, parent=child) 

merger.write("test.pdf")   

if __name__ == "__main__": 
    main() 

私は結果のPDFが持つことを期待します3つのネストされたブックマーク

blabla 
    blabla 
     blabla 

のレベルではなく、私は

blabla 
    blabla 
    blabla 

必ずこれが起こらないようにする任意の方法を取得?

編集:pagenum変数を削除して、3つのブックマークで同じページを指し示したいと思っています。

答えて

4

これはPdfFileMerger.addBookmark()メソッドのバグです。いくつかの詳細がありますhere

以下は、PdfFileWriterとそのメソッドを使用した場合の回避策です。私は、同じ名前で、同じページ上のすべてを3つのネストされたブックマークを取得することができ、これを使用する:

blabla 
    blabla 
     blabla 

コードPdfFileWriter回避策使用して:また

from PyPDF2 import PdfFileReader, PdfFileWriter 

def main(): 

    writer = PdfFileWriter() 
    pagenum = 0 
    firstOne = True 
    for file in ["a.pdf","b.pdf","c.pdf"]: 
     print("next row") 
     pdf = PdfFileReader(open(file,"rb")) 
     writer.appendPagesFromReader(pdf) 
     if firstOne: 
      child = writer.addBookmark(title="blabla",pagenum=pagenum, parent=None) 
      firstOne = False 
     else: 
      child = writer.addBookmark(title="blabla",pagenum=pagenum, parent=child) 

    d = open("test.pdf", "wb") 
    writer.write(d)   

if __name__ == "__main__": 
    main() 

を、私はPyPDF2を修正するに行くを持っていましたライブラリはこの問題を解決するために私は非常にPythonで経験していないので、新しい/他の問題を導入している可能性があります!メンテナへのプルリクエストを提出したが、それまであなたは私のフォークのクローンを作成でき、そこからPyPDF2をインストールします。その後

git clone https://github.com/khalida/PyPDF2.git 
cd PyPDF2 
python setup.py sdist 
sudo -H pip uninstall -y PyPDF2 
sudo -H pip install dist/PyPDF2-1.26.0.tar.gz 

をあなたがPdfFileMerger.addBookmark()から必要なネストを得ることができる必要があります。私は上記のケースでそれをテストしましたが、それ以上のテストは行っていません。

+0

はい私はそれらをすべて同じページに入れることを意図していました。したがって、 'pageNum'をインクリメントしません。あなたは私が得たものを確認しています:PyPdf2に同じ名前のブックマークを無制限に持つ方法はないようです。しかし、それは 'pdf'形式やライブラリの機能ですか? – Chapo

+0

ああ、私の悪い。なぜ3人の入れ子にされたブックマークがすべて同じページを指しているのかを考えることはできませんでした。私が知る限り、これは 'PdfFileMerger.addBookmark()'メソッドのバグです。詳細はこちら[https://github.com/mstamy2/PyPDF2/issues/40]。私は回避策を使って自分の答えを更新します。 – kabdulla

+0

あなたのリンクから 'この特定のアプリケーションでPdfFileMergerを使う理由は、PdfFileWriterが、出力ファイルが書き込まれるまですべてのソースファイルを開いたままにする必要があるようです。その場合も同じことが私に当てはまりますが、あなたのソリューションは私の質問のために働くので、それでも私はそれを検証します。ご協力いただきありがとうございます。 – Chapo

関連する問題