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を読めるようになっていた