pdf-slide-divider スライドが1ページに複数面割り付けられている(例えば3×3面とか2×2面とか)PDFファイルを1ページ1面ごとに分割する

2020/06/19 1:05
例えば何かの資料として、PowerPointで作成したとおぼしきスライドを1ページに複数面割り付けたPDFファイルを受け取ることがあります。
このままだと製本やファイリングしにくいので、1面1枚ずつに分割したいときがあります。
そのときのためのツールです。
「2 in 1 印刷」や「冊子印刷」に対応した形式でも出力できます。

処理のイメージ
divide_image.png



Perlで書いています。Imagemagick が要ります。

ウェブ上で使える、CGI版も用意しました。
https://satomichan.jp/cgi/pdf-slide-divider/


ソースは

続きを読む

2020/04/05(日)mplayer用のPlayListを生成する

2020/04/06 0:53
Perl で書きました。Linux 等向けの mplayer に読ませるために、カレントディレクトリ以下の音楽ファイル(.mp3/.wma)があるディレクトリに、プレイリストを生成していきます。
「ディレクトリを再帰的にたどりファイル一覧を取得したい その1 - Perl - とあるエンジニアの闇歴史帳」(http://tech.katsubemakito.net/perl/dir_recursion1) を参考にさせていただきました。

音楽ファイルは文字コード順で並び替えられるのが前提(例: 00_zzz.mp3 , 01_yyy.mp4 , ...)です。

#!/usr/bin/perl

use strict;
 
#-- 再帰実行 --#
reflexiveFile('.');

exit;



sub reflexiveFile{
	my $dir = shift;
	my @list = ();
 
	#-- カレントの一覧を取得 --#
	opendir(DIR, $dir) or die("Can not open directory:$dir ($!)");
	@list = readdir(DIR);
	closedir(DIR);

	my $count_file  = 0;
	my @music_files = ();
	foreach my $file (sort @list){
		next if $file =~ /^\.{1,2}$/;
		
		if( -d "$dir/$file" ){
			#ディレクトリ
			reflexiveFile("$dir/$file");

		}else{
			#ファイル
			$count_file++;
			
			#音楽ファイル
			push(@music_files, $file) if $file =~ /\.(mp3|wma)$/i;
		}
	}
	#print "$dir : $count_file @music_files\n";
	
	#音楽ファイルのみがあるディレクトリならば
	if(@music_files > 0 && @music_files == $count_file){
		my $c_dir = ( split(m|/|, $dir) )[-1];
		print "$dir    $c_dir.playlist.txt\n";
		open(PL, ">$dir/$c_dir.playlist.txt");
		print PL join("\n", @music_files). "\n";
		close(PL);
	}
	
 
}

2020/04/05(日)PDFファイルにインデックス・タブを付加する

2020/04/26 18:32
index_tab.png

このようなページ頭出し用のインデックス・タブ(黒い箱)を 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;