206 lines · 4.5 KB · Perl
RawDownload
#!/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# 	<text># 	showpage# 	%%Page: 2 2# 	<text># 	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# 	<text># 	showpage# 	end# 	%%Page: 2 2# 	NTPSOct95 begin# 	<text># 	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    }}