#!/usr/bin/env perl # # psjoin - concatenate PostScript files # # version 0.2, 2002-07-18 # version 0.3, 2003-11-30 # version 0.31, 2013-10-20 # # versions up to 0.3 by Tom Sato , http://homepage3.nifty.com/tsato/ # versions from 0.31 by Reuben Thomas use strict; use warnings; use Getopt::Long; my $version = 0.31; sub usage { my ($exit_code) = @_; print STDERR < \$force_even, "save|s" => \$force_save, "strip|p" => \$dont_strip, "help|h" => \$help_flag, "version|V" => \$version_flag, ) or usage(1); if ($help_flag) { usage(0); } elsif ($version_flag) { print "psjoin (version $version)\n"; print "(c) Tom Sato and Reuben Thomas \n"; exit 0; } if ($force_save) { $save = "/#psjoin-save# save def %psjoin\n"; $restore = "#psjoin-save# restore %psjoin\n"; } my (@prolog, $prolog_inx, @trailer, @comments, @pages); if ($dont_strip) { $prolog_inx = 9999; $prolog[$prolog_inx] = "% [ psjoin: don't strip ]\n"; $trailer[$prolog_inx] = "% [ psjoin: don't strip ]\n"; } else { for (my $i = 0; $i <= $#ARGV; $i++) { open(IN, $ARGV[$i]) || die "$0: can't open \"$ARGV[$i]\" ($!)"; my $in_comment = 1; my $in_prolog = 1; my $in_trailer = 0; $comments[$i] = ""; $prolog[$i] = ""; $trailer[$i] = ""; $pages[$i] = 0; while () { next if /^%%BeginDocument/ .. /^%%EndDocument/; if ($in_comment) { next if /^%!PS-Adobe-/; next if /^%%Title/; next if /^%%Pages/; next if /^%%Creator/; $in_comment = 0 if /^%%EndComments/; $comments[$i] .= $_; next; } elsif ($in_prolog) { if (/^%%Page:/) { $in_prolog = 0; } else { $prolog[$i] .= $_; next; } } $in_trailer = 1 if /^%%Trailer/; if ($in_trailer) { $trailer[$i] .= $_; next; } $pages[$i]++ if /^%%Page:/; } close(IN); if ($prolog[$i]) { for (my $j = 0; $j < $i; $j++) { if ($prolog[$j] eq $prolog[$i]) { $pages[$j] += $pages[$i]; last; } } } } my $largest = 0; $prolog_inx = 0; for (my $i = 0; $i <= $#ARGV; $i++) { my $size = length($prolog[$i]) * $pages[$i]; if ($largest < $size) { $largest = $size; $prolog_inx = $i; } } } print <) { if (/^%%BeginDocument/ .. /^%%EndDocument/) { # s/^(%[%!])/% \1/; print $_; } else { if ($in_comment) { $in_comment = 0 if /^%%EndComments/; } elsif ($in_prolog) { if (/^%%Page:/) { $in_prolog = 0; } else { next; } } $in_trailer = 1 if !$dont_strip && /^%%Trailer/; next if $in_trailer; if (/^%%Page:/) { if ($saved) { print $trailer[$i]; print $restore; $saved = 0; } $pages++; $total_pages++; print "\n"; print "%%Page: ($i-$pages) $total_pages\n"; if ($prolog[$i] ne $prolog[$prolog_inx]) { print $save; print $prolog[$i]; $saved = 1; } elsif ($force_save) { print $save; } } else { s/^(%[%!])/% $1/; print $_; } } } close(IN); if ($force_even && $pages % 2 != 0) { $pages++; $total_pages++; print <