2020/04/05(日)PDFファイルにインデックス・タブを付加する
2020/11/03 11:31
このようなページ頭出し用のインデックス・タブ(黒い箱)を PDF ファイルに付け加えます。
奇数ページ/偶数ページで位置(左右)を変えています。A5サイズで調整したので、適宜変更してください。
beta.png という名前の 単色で塗りつぶした画像ファイルを別途用意してください(サイズは何でもいいです。)。
使い方の例
./tab.pl in.pdf out.pdf 1 15,29,44 2
【第0引数】オリジナルPDFファイル名
【第1引数】インデックス・タブ付加後のPDFファイル名
【第2引数】初期 index 位置(上から 1, 2, 3, ...)デフォルト=1
【第3引数】index 位置が変わるページNo. (最初のページは p.1) (ex '15,29,44') デフォルト=なし(一度も変えない)
【第4引数】目次ページNo. (全てのインデックス・タブを描画するページ) デフォルト=目次ページなし
第2引数~第4引数は省略可能です。
Perl で書いています。要PDFtk。
ソースはこちら。
#!/usr/bin/perl -w use strict; use utf8; use PDF::API2; use GD; $ENV{'PATH'} = '/usr/bin:/bin'; #インデックスのサイズ my $index_h = int( 595 * 0.1 ); my $index_w = int( 421 * 0.05 ); my $index_span = int( $index_h * 0.1 ); #ARGV[0] オリジナルPDFファイル名 #ARGV[1] インデックス・タブ付加後のPDFファイル名 #ARGV[2] 初期 index 位置(上から 1, 2, 3, ...) #ARGV[3] index 位置が変わるページNo. (最初のページは p.1) (ex '15,29,44') #ARGV[4] 目次ページNo. (全てのインデックス・タブを描画するページ) # ex) ./tab.pl in.pdf out.pdf 1 15,29,44 2 my($org_pdf, $stamped_pdf, $start_index, $index_change, $index_page) = @ARGV; die unless ($org_pdf && $stamped_pdf); $start_index = 1 unless $start_index; $index_change = '' unless $index_change; my @index_change_pages = split(/,/, $index_change); #オリジナルPDFのページ数取得 my $org_pages; open(my $PAGES, "pdftk $org_pdf dump_data | grep NumberOfPages |"); foreach my $line (<$PAGES>){ if($line =~ /NumberOfPages: (\d+)/){ $org_pages = $1; } } close($PAGES); #stamp 用 PDF ファイル生成 my $pdf = PDF::API2->new(); my $stamp_pdf = 'stamp.pdf'; my $this_index = $start_index; for(my $i = 1; $i <= $org_pages; $i++){ $this_index++ if grep {$_ == $i} @index_change_pages; my $page = $pdf->page(); $page->mediabox("A5"); my $paper_w = ($page->mediabox)[2]; my $paper_h = ($page->mediabox)[3]; my $img = $pdf->image_png('beta.png'); my $index_f = $this_index; my $index_t = $this_index; if($index_page && $i == $index_page){ $index_f = $start_index; $index_t = $start_index + @index_change_pages; } for my $now_draw_index ($index_f..$index_t){ my $x = ($i % 2 == 0) ? 0 : $paper_w - $index_w; my $y = $paper_h - ($index_h + $index_span) * ($now_draw_index + 1); printf "page:%d index:%d w:%3d h:%3d x:%3d y:%3d\n", $i, $now_draw_index, $paper_w, $paper_h, $x, $y; my $gfx = $page->gfx; $gfx->image($img, $x, $y, $index_w, $index_h); } } $pdf->saveas($stamp_pdf); #スタンプをマスクする system("pdftk $org_pdf multistamp $stamp_pdf output $stamped_pdf"); exit;