メモ@inudaisho

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

[perl] 既存のPDFに目次をつける

そういうことで、perlのPDF::API2をつかっておなじことをしたら簡単にできた。
http://search.cpan.org/dist/PDF-API2/

use strict;
use utf8;
use PDF::API2;
use Encode;

my %hOutline = (
    1 => "天津城南門ノ第一門",
    2 => "天津城南門ノ第二門",
    3 => "天津都督衙門",
    4 => "天津水師営砲台ノ外面",
    5 => "天津水師営砲台ノ内部",
    6 => "北倉守備隊前ノ白河ニ我工兵ノ架シタル船橋\n改行のテスト",
    10 => "馬房に於ける日本軍ノ守備隊"
);

my $oNewpdf = PDF::API2->new();
my $oOutlineRoot = $oNewpdf->outlines();
my $oOldpdf = PDF::API2->open('774472_00020-00029.pdf');
for(my $iIndex = 1;$i <= 10;$i++){
    my $oPage = $oNewpdf->importpage($oOldpdf,$iIndex);
    if( $hOutline{$iIndex}){
       my $oOutline = $oOutlineRoot->outline();
       $oOutline->title(Encode::encode("utf16",$hOutline{$iIndex}));
       $oOutline->dest($oPage);
    }
}
$oNewpdf->saveas('output.pdf');

(0620 追記: 改行や「上」「尊」「霊」など文字コードに0Aを持つものが化ける。PDF::API2内部では出力時に:rawをつけているのでその他のところでなにか変な変換がかかっている模様。最初のうちわからなかったのは改行のうしろを「text」にしていたから)

まぁこの要領で結合も簡単にできると。うーむ。
6つ目にあるように、pdfのoutlineの中で改行させたいときは\nをいれたらできた。それはpythonの方でもおなじ。
ちなみにツリー状にしたかったら$oOutlineに対して$oOutline->outlines()していけばよいらしい。

my $oOutlineRoot = %oNewpdf->outlines();
my $oBranchs = oOutlineRoot->outlines();
my $oBranch1 = $oBranchs->outline();
my $oReafs1 = $oBranch1->outlines();
my $oReaf1_1 = $oReafs1->outline();
my $oReaf1_2 = $oReafs1->outline();
my $oBranch2 = $oBranch2->outline();
my $oReafs2 = $oBranch2->outlines();
my $oReafs2_1 = $oReafs2->outline();
# ....

reportlabの方だと深さを引数で指定する。どっちのやりかたも一長一短、とにかくできたらいい。


(6/20 追記
PDF::API2 が微妙に使えないことがわかったので PDF::Reuse でやってみた。PDFをものすごく簡単にあつかえるが、目次に日本語をつっこんだらPDFがこわれてしまって表示すらできない。つかえない...結局pythonに戻るんだろうか。
つづき↓
[ruby] 既存のPDFに目次をつける - メモ
)