メモ@inudaisho

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

既存PDFに目次をつける

これまでのあらすじ

そんな状態でなんとかなりそうな気がしたのが rubyprawn だった。
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生成のためのライブラリであって、取り込み追加はオマケということか。むー、残念。

    • rubyprawn は既存のpdfを追加するあたりがまだまだオマケ機能で追加すればするほどファイルサイズが膨れあがってしまう。目次追加機能は問題なく自由度高い。