#!/usr/bin/perl # $Id: fixmswrd.pl,v 1.4 2002/02/21 21:53:01 giles Exp $ # (C) 1997 Anthony Shipman # # This software is provided 'as-is', without any express or implied # warranty. In no event will the authors be held liable for any damages # arising from the use of this software. # # Permission is granted to anyone to use this software for any purpose, # including commercial applications, and to alter it and redistribute it # freely, subject to the following restrictions: # # 1. The origin of this software must not be misrepresented; you must not # claim that you wrote the original software. If you use this software # in a product, an acknowledgment in the product documentation would be # appreciated but is not required. # 2. Altered source versions must be plainly marked as such, and must not be # misrepresented as being the original software. # 3. This notice may not be removed or altered from any source distribution. # # Anthony Shipman shipmana@acm.org # This program patches the postscript generated by MS Word printer drivers # so that they work with ghostview 1.5. The problem is that the document # structuring conventions are not followed by Word. The pages are supposed # to be independent but they depend on a dictionary being opened outside # of the pages. The erroneous structure is # # %%EndSetup # NTPSOct95 begin # %%Page: 1 1 # # showpage # %%Page: 2 2 # # showpage # ...... # %%Trailer # ... # end # %%EOF # # This only works if the all of the structure around the pages is preserved. # The opening of NTPSOct95 happens outside of any structured section so # it is never seen by ghostview. We change the structure to # # %%EndSetup # %%Page: 1 1 # NTPSOct95 begin # # showpage # end # %%Page: 2 2 # NTPSOct95 begin # # showpage # end # ...... # %%Trailer # ... # %%EOF # # That is the dictionary opening is repeated inside each page. # # We add a comment to the document to mark that it has been converted. # This has the form # %LOCALGhostviewPatched # # Usage: # fixmswrd [-v] [file [output-file]] require 'getopts.pl'; #================================================================= $program = "fixmswrd"; sub usage { die "Usage: $program [-v] [file [output-file]]\n"; } #================================================================= &Getopts("v") || &usage; $verbose = $opt_v; $infile = shift(@ARGV); if ($infile) { open(INFILE, $infile) || die "$program: Cannot read from $infile\n"; $handle = "INFILE"; } else { $handle = "STDIN"; } $outfile = shift(@ARGV); if ($outfile) { open(OUTFILE, ">$outfile") || die "$program: Cannot write to $outfile\n"; select(OUTFILE); } # This reads the header comments and detects the presence of the marker. $have_marker = 0; undef $dict_name; undef $dict_line; &read_comments; &put_comments; if ($have_marker) { $verbose && print STDERR "$program: Warning - already converted\n"; while(<$handle>) # pass the file through unchanged. { print; } } else { $seen_trailer = 0; while(<$handle>) # massage the file { if ($dict_line) { next if (/$dict_line/o); # drop the old begin line $seen_trailer = 1 if (/^%%Trailer/); next if ($seen_trailer and /^end/); # drop the old end line } print; if (/^%%Page:/) { print "$dict_name begin\n"; # add at the start of the page } elsif (/^showpage/) { print "end\n"; # add at the end of the page } elsif (/^%%BeginResource: procset (\S+)/) { $dict_name = $1; $dict_line = "^$dict_name begin"; } elsif (/^%%BeginProcSet: (\S+)/) # for older document versions { $dict_name = $1; $dict_line = "^$dict_name begin"; } elsif (/^%%EndProlog:/) { unless ($dict_line) { $verbose && print STDERR "$program: Warning - unrecognised document structure\n"; } } } } exit 0; #================================================================= # This reads all of the header comments into an array which we can write # out again later. In addition we detect the presence of the marker comment. sub read_comments { @headers = (); while (<$handle>) { # without chopping push(@headers, $_); if (/^%LOCALGhostviewPatched/) { $have_marker = 1; } last if /^%%EndComments/; } } sub put_comments { foreach $h (@headers) { if (!$have_marker and ($h =~ /^%%EndComments/)) { print "%LOCALGhostviewPatched\n"; } print $h; # contains the newline } }