これまでのあらすじ
- [python] 既存PDFに目次をつける - メモ
- [perl] 既存PDFに目次をつける - メモ
- perl だと PDF::API2 でできたが日本語の一部が文字化けする。PDF::Reuse は日本語を目次につっこもうとするとPDFがこわれる。
そんな状態でなんとかなりそうな気がしたのが ruby の prawn だった。
http://prawn.majesticseacreature.com/
require 'prawn' hOutline = { 1 => "天津城南門ノ第一門", 2 => "天津城南門ノ第二門", 3 => "天津都督衙門", 4 => "天津水師営砲台ノ外面", 5 => "天津水師営砲台ノ内部", 6 => "北倉守備隊前ノ白河ニ我工兵ノ架シタル船橋\n改行のテスト", 8 => "文字化けテスト霊上尊", 10 => "馬房ニ於ケル日本軍ノ守備隊" } Prawn::Document.new(:template => '774472_00020-00029.pdf') do outline.define do for i in 1..10 page :title => hOutline[i], :destination => i if hOutline.has_key?(i) end end render_file "xxxx.pdf" end
なんかドキュメントが整備されてないんだがとりあえずできた。既存のpdfもテンプレートという名目でどんどん追加できそう。
目次の入れ子のやりかたはこんな感じ。
#セクションを最初っから指定する方法 outline.define do section("section1",:destination => 1) end outline.define do section("section2",:destination => 9) do outline.page :title => "addddd1", :destination => 5 outline.page :title => "ad1", :destination => 3 end end #sectionとpageにはブロックで子をたくさん指定できるかできないかの違いしかない #どんどん子孫をつけていく方法 outline.add_subsection_to("天津都督衙門") do outline.page :title => "add1", :destination => 2 end outline.add_subsection_to("add1") do outline.section("add2") do outline.page :title => "add3", :destination => 8 outline.page :title => "add4" outline.page :title => "add5", :destination => 7 end end
既存のpdfを追加するには新pdfのブロックの中でこうしていく。
start_new_page(:template => '774472_00020-00029.pdf',:template_page=>1) #... start_new_page(:template => '774472_00020-00029.pdf',:template_page=>10)
1ページ追加するごとにいちいちファイルを開いているので遅い。しかも追加するpdfのページ数を取得するために内部でつかっているPDF::Readerをつかったら余計におそくなる。うーむ。
しかも1ページ追加するためにファイル全体追加しているようで、pyPdf,PDF::API2と比較の実験をしてみたらファイルサイズが10倍くらいに膨れてしまった。まぁPDF生成のためのライブラリであって、取り込み追加はオマケということか。むー、残念。