dviファイルのノンブルの抽出
ちょっと必要があって,dviファイルのページをdviファイルから引き出すスクリプトを書きました.紛失防止の意味も込めて超いいかげんなものを晒します.
ノンブルは一貫している(つまり,途中でリセットとかされない)のが大前提です.
use strict; use warnings; use Fcntl ":seek"; my $buf=0; my $byte=1; my $dviver = 2; my $pre = 247; my $post = 248; my $dummy=223; my $first_page; my $last_page; my $dvifile=$ARGV[0]; open my $fh_dvi, "<", $dvifile or die "file open error: $!"; binmode $fh_dvi; ## ##pre ### seek $fh_dvi, 0, SEEK_SET; read $fh_dvi, $buf, $byte; $buf = unpack 'C', $buf; die "uncorrect dvi file!" if $buf != $pre; read $fh_dvi, $buf, $byte; $buf = unpack 'C', $buf; die "uncorrect dvi file!" if $buf != $dviver; seek $fh_dvi, 12, SEEK_CUR; read $fh_dvi, $buf, $byte;#k $buf = unpack 'C', $buf; read $fh_dvi, $buf, $buf*$byte;##num ## ##first bop ## read $fh_dvi, $buf, $byte;#bop read $fh_dvi, $buf, 4*$byte;#c0[4] $first_page = unpack 'N', $buf; ## ##post_post ## ###dviの最後の223を読み飛ばす $buf=$dummy; seek $fh_dvi, 0, SEEK_END; my $i=0; while ($buf == 223) { $i--; seek $fh_dvi, $i, SEEK_END; read $fh_dvi, $buf, $byte; $buf = unpack 'C', $buf; } die "uncorrect dvi file!" unless 4 <= abs($i)-1 && abs($i)-1<=7 && ($buf==2 || $buf==3); ##post の位置を得る seek $fh_dvi, -5, SEEK_CUR; read $fh_dvi, $buf, 4*$byte; $buf = unpack 'N', $buf; ## ##post ## seek $fh_dvi, $buf, SEEK_SET; read $fh_dvi, $buf, $byte; $buf = unpack 'C', $buf; die "uncorrect dvi file!" unless $buf==$post; seek $fh_dvi, 26, SEEK_CUR; read $fh_dvi, $buf, 2*$byte;##t $buf = unpack 'n', $buf; $last_page = $first_page + $buf -1; $first_page=sprintf "%04d",$first_page; $last_page=sprintf "%04d",$last_page; print $first_page,"\n"; print $last_page; close $fh_dvi;
それにしてもきたないし,不親切.もっと整理しないと.