メモ@inudaisho

君見ずや出版 / 興味次第の調べ物置き場

既存PDFに目次をつける

2023/03/20 ここの情報は古いのでこっちでも見てくださいな
inudaisho.hatenablog.com

pythonのPDF操作ライブラリ

ライブラリ名 目次をつけれる 既存PDFを操作
pypdf x o
reportlab o x

(reportlab有料版は既存PDFを操作できるらしい)
http://pybrary.net/pyPdf/
http://www.reportlab.com/software/opensource/

しかし既存PDFに目次をつけたいので探してみたら pdfrw というのがあった。
http://code.google.com/p/pdfrw/
pdfrw 単体で pypdf のようなことができるが、pdfrw を reader、reportlab を writer として組みあわせることができるという。

ということで既存のPDFに目次をつけるサンプル

# -*- coding:utf-8 -*-
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl 
from reportlab.pdfgen.canvas import Canvas

dOutline = {
 0: u"天津城南門ノ第一門",
 1: u"天津城南門ノ第二門",
 2: u"天津都督衙門",
 3: u"天津水師営砲台ノ外面",
 4: u"天津水師営砲台ノ内部",
 7: u"北倉守備隊前ノ白河ニ我工兵ノ架シタル船橋",
 9: u"馬房ニ於ケル日本軍ノ守備隊"
}
 
oPages = PdfReader("774472_020-029.pdf",decompress=False).pages
oPages = [pagexobj(x) for x in oPages]
oCanvas = Canvas("774472_20-29_withOutline.pdf")

oCanvas.bookmarkPage("0")
oCanvas.addOutlineEntry(u"もくじ","0")
for iIndex ,oPage in enumerate(oPages):
    oCanvas.setPageSize(tuple(oPage.BBox[2:]))
    oCanvas.doForm(makerl(oCanvas,oPage))
    if iIndex in dOutline:
        sBookmark = str(index) + "p"
        oCanvas.bookmarkPage(sBookmark)
        oCanvas.addOutlineEntry(dOutline[iIndex],sBookmark,1)
    oCanvas.showPage()
oCanvas.showOutline()
oCanvas.save()

とりあえずできることがわかった。

#0616追記
pdfrwだが結構読めないPDFがある。たとえば近代デジタルライブラリから落とした素のままだと読めない。それをpypdfで結合したあとのものだと読める。ということでpdfrwをpypdfのかわりにするのはできず、pypdfとreportlabの仲介くらいしかできなさそう。

#2012/11追記
pdfrw単体でも近代デジタルライブラリがはきだすPDFを読めるようになっていた