Cha*_*apo 9 python pdf bookmarks pypdf pypdf2
当您尝试使用相同名称嵌套多个书签时,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()
Run Code Online (Sandbox Code Playgroud)
我希望得到的pdf有三层嵌套书签
blabla
blabla
blabla
Run Code Online (Sandbox Code Playgroud)
但我得到了
blabla
blabla
blabla
Run Code Online (Sandbox Code Playgroud)
有什么方法可以确保不会发生这种情况?
编辑:我已删除pagenum变量,因为我希望这3个书签指向同一页面.
这似乎是PdfFileMerger.addBookmark()方法的错误。有一些细节在这里
下面是一种变通方法使用PdfFileWriter及其addBookmark()方法。使用它,我可以在同一页面上获得 3 个具有相同名称的嵌套书签:
blabla
blabla
blabla
Run Code Online (Sandbox Code Playgroud)
使用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()
Run Code Online (Sandbox Code Playgroud)
或者,我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
Run Code Online (Sandbox Code Playgroud)
之后,您应该能够从中获得您想要的嵌套PdfFileMerger.addBookmark()。我已经针对上述案例对其进行了测试,但除此之外还没有进行任何测试。
| 归档时间: |
|
| 查看次数: |
626 次 |
| 最近记录: |