'Add a bookmark to a PDF with PyPDF2
I'm trying to add a bookmark to a PDF using PyPDF2. I run the following with no problems. But a bookmark is never created. Any thoughts on what I'm doing wrong. The PDF is 2 pages long.
from PyPDF2 import PdfFileReader, PdfFileWriter
reader = PdfFileReader("test.pdf") # open input
writer = PdfFileWriter() # open output
writer.addPage(reader.getPage(0)) # insert page
writer.addBookmark("Hello, World Bookmark", 0, parent=None) # add bookmark
Solution 1:[1]
I ran your code (adding the text below it to write out the pdf) and found a bookmark was, in fact, created.
from PyPDF2 import PdfFileReader, PdfFileWriter
writer = PdfFileWriter() # open output
reader = PdfFileReader("test.pdf") # open input
writer.addPage(reader.getPage(0)) # insert page
writer.addBookmark("Hello, World Bookmark", 0, parent=None) # add bookmark
with open("result.pdf", "wb") as fp: # creating result pdf JCT
writer.write(fp) # writing to result pdf JCT
Check the bookmarks panel in your result. Having bookmarks doesn't automatically cause a PDF to open to the bookmarks panel.
To make it open to the bookmarks panel with PyPDF2, add one line:
writer = PdfFileWriter() # open output
reader = PdfFileReader("test.pdf") # open input
writer.addPage(reader.getPage(0)) # insert page
writer.addBookmark("Hello, World Bookmark", 0, parent=None) # add bookmark
writer.setPageMode("/UseOutlines") # This is what tells the PDF to open to bookmarks
with open("result.pdf", "wb") as fp: # creating result pdf JCT
writer.write(fp) # writing to result pdf JCT
Solution 2:[2]
Thanks for James' code. But it only outputs one-page pdf file and doesn't show how to add multiple bookmarks. Here is a revised version of his code to do so.
from PyPDF2 import PdfFileReader, PdfFileWriter
reader = PdfFileReader("test.pdf") # open input
writer = PdfFileWriter() # open output
n = reader.getNumPages()
for i in range(n):
writer.addPage(reader.getPage(i)) # insert page
# add a bookmark on the first page
writer.addBookmark("Hello, World Bookmark", 0, parent=None)
# add a bookmark on the sixth page
par = writer.addBookmark("Second Bookmark", 5, parent=None)
# add a child bookmark on the eighth page
writer.addBookmark("Third Bookmark", 7, parent=par)
with open("result.pdf", "wb") as fp: # creating result pdf JCT
writer.write(fp) # writing to result pdf JCT
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Martin Thoma |
Solution 2 | Martin Thoma |