具有相同名称的 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()
first_one = True
for file in ["a.pdf", "b.pdf", "c.pdf"]:
print("next row")
reader = PdfFileReader(file)
merger.append(reader)
if first_one:
child = merger.addBookmark(title="blabla", pagenum=1)
first_one = 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()
方法的错误。有一些细节here
下面是使用 PdfFileWriter
及其 addBookmark()
方法的解决方法。使用这个我可以获得 3 个嵌套书签,名称相同,都在同一页上:
blabla
blabla
blabla
使用 PdfFileWriter
解决方法的代码:
from PyPDF2 import PdfFileReader, PdfFileWriter
def main():
writer = PdfFileWriter()
pagenum = 0
first_one = True
for file in ["a.pdf", "b.pdf", "c.pdf"]:
print("next row")
reader = PdfFileReader(file)
writer.appendPagesFromReader(reader)
if first_one:
child = writer.addBookmark(
title="blabla", pagenum=pagenum, parent=None
)
first_one = False
else:
child = writer.addBookmark(
title="blabla", pagenum=pagenum, parent=child
)
with open("test.pdf", "wb") as d:
writer.write(d)
if __name__ == "__main__":
main()
或者,我尝试修改 PyPDF2
库来解决这个问题,尽管我在 python 方面不是很有经验,所以可能引入了 new/other 问题!已向维护者提交拉取请求,但在此之前你可以克隆我的分支,并从那里安装 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()
获得您想要的嵌套。我已经针对上述情况对其进行了测试,但除此之外没有进行任何测试。
当您尝试嵌套多个同名书签时,PyPDF2 不会将其考虑在内。 下面是自包含的 python 代码来测试我的意思(你需要在工作文件夹中有 3 个名为 a、b 和 c 的 pdf 文件来测试它)
from PyPDF2 import PdfFileReader, PdfFileMerger
def main():
merger = PdfFileMerger()
first_one = True
for file in ["a.pdf", "b.pdf", "c.pdf"]:
print("next row")
reader = PdfFileReader(file)
merger.append(reader)
if first_one:
child = merger.addBookmark(title="blabla", pagenum=1)
first_one = 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()
方法的错误。有一些细节here
下面是使用 PdfFileWriter
及其 addBookmark()
方法的解决方法。使用这个我可以获得 3 个嵌套书签,名称相同,都在同一页上:
blabla
blabla
blabla
使用 PdfFileWriter
解决方法的代码:
from PyPDF2 import PdfFileReader, PdfFileWriter
def main():
writer = PdfFileWriter()
pagenum = 0
first_one = True
for file in ["a.pdf", "b.pdf", "c.pdf"]:
print("next row")
reader = PdfFileReader(file)
writer.appendPagesFromReader(reader)
if first_one:
child = writer.addBookmark(
title="blabla", pagenum=pagenum, parent=None
)
first_one = False
else:
child = writer.addBookmark(
title="blabla", pagenum=pagenum, parent=child
)
with open("test.pdf", "wb") as d:
writer.write(d)
if __name__ == "__main__":
main()
或者,我尝试修改 PyPDF2
库来解决这个问题,尽管我在 python 方面不是很有经验,所以可能引入了 new/other 问题!已向维护者提交拉取请求,但在此之前你可以克隆我的分支,并从那里安装 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()
获得您想要的嵌套。我已经针对上述情况对其进行了测试,但除此之外没有进行任何测试。