#!/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 [email protected]
# 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
}
}
|