簡體   English   中英

具有相同名稱的 PyPdf2 嵌套書簽不起作用

[英]PyPdf2 nested bookmarks with same name not working

當您嘗試嵌套多個具有相同名稱的書簽時,PyPdf2 不會將其考慮在內。 下面是自包含的 python 代碼來測試我的意思(你需要在工作文件夾中有 3 個名為 a、b 和 c 的 pdf 文件來測試它)

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 具有三層嵌套書簽

blabla
    blabla
        blabla

但我得到了

blabla
    blabla
    blabla

有什么方法可以確保這不會發生?

編輯:我刪除了pagenum變量,因為我希望這 3 個書簽指向同一頁面。

這似乎是PdfFileMerger.addBookmark()方法的一個錯誤。 有一些細節在這里

下面是使用PdfFileWriter及其addBookmark()方法的解決方法。 使用它,我可以在同一頁面上獲得 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修改PyPDF2庫來解決這個問題,雖然我在 python 方面不是很有經驗,所以可能引入了新的/其他問題! 已經向維護者提交了一個 pull-request,但在那之前你可以克隆我的 fork,並從那里安裝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()獲得您想要的嵌套。 我已經針對上述案例對其進行了測試,但除此之外還沒有進行任何測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM