17dd7cddfSDavid du Colombier#!/usr/bin/perl 2*593dc095SDavid du Colombier# $Id: fixmswrd.pl,v 1.4 2002/02/21 21:53:01 giles Exp $ 37dd7cddfSDavid du Colombier 47dd7cddfSDavid du Colombier# (C) 1997 Anthony Shipman 57dd7cddfSDavid du Colombier# 67dd7cddfSDavid du Colombier# This software is provided 'as-is', without any express or implied 77dd7cddfSDavid du Colombier# warranty. In no event will the authors be held liable for any damages 87dd7cddfSDavid du Colombier# arising from the use of this software. 97dd7cddfSDavid du Colombier# 107dd7cddfSDavid du Colombier# Permission is granted to anyone to use this software for any purpose, 117dd7cddfSDavid du Colombier# including commercial applications, and to alter it and redistribute it 127dd7cddfSDavid du Colombier# freely, subject to the following restrictions: 137dd7cddfSDavid du Colombier# 147dd7cddfSDavid du Colombier# 1. The origin of this software must not be misrepresented; you must not 157dd7cddfSDavid du Colombier# claim that you wrote the original software. If you use this software 167dd7cddfSDavid du Colombier# in a product, an acknowledgment in the product documentation would be 177dd7cddfSDavid du Colombier# appreciated but is not required. 187dd7cddfSDavid du Colombier# 2. Altered source versions must be plainly marked as such, and must not be 197dd7cddfSDavid du Colombier# misrepresented as being the original software. 207dd7cddfSDavid du Colombier# 3. This notice may not be removed or altered from any source distribution. 217dd7cddfSDavid du Colombier# 227dd7cddfSDavid du Colombier# Anthony Shipman shipmana@acm.org 237dd7cddfSDavid du Colombier 247dd7cddfSDavid du Colombier# This program patches the postscript generated by MS Word printer drivers 257dd7cddfSDavid du Colombier# so that they work with ghostview 1.5. The problem is that the document 267dd7cddfSDavid du Colombier# structuring conventions are not followed by Word. The pages are supposed 277dd7cddfSDavid du Colombier# to be independent but they depend on a dictionary being opened outside 287dd7cddfSDavid du Colombier# of the pages. The erroneous structure is 297dd7cddfSDavid du Colombier# 307dd7cddfSDavid du Colombier# %%EndSetup 317dd7cddfSDavid du Colombier# NTPSOct95 begin 327dd7cddfSDavid du Colombier# %%Page: 1 1 337dd7cddfSDavid du Colombier# <text> 347dd7cddfSDavid du Colombier# showpage 357dd7cddfSDavid du Colombier# %%Page: 2 2 367dd7cddfSDavid du Colombier# <text> 377dd7cddfSDavid du Colombier# showpage 387dd7cddfSDavid du Colombier# ...... 397dd7cddfSDavid du Colombier# %%Trailer 407dd7cddfSDavid du Colombier# ... 417dd7cddfSDavid du Colombier# end 427dd7cddfSDavid du Colombier# %%EOF 437dd7cddfSDavid du Colombier# 447dd7cddfSDavid du Colombier# This only works if the all of the structure around the pages is preserved. 457dd7cddfSDavid du Colombier# The opening of NTPSOct95 happens outside of any structured section so 467dd7cddfSDavid du Colombier# it is never seen by ghostview. We change the structure to 477dd7cddfSDavid du Colombier# 487dd7cddfSDavid du Colombier# %%EndSetup 497dd7cddfSDavid du Colombier# %%Page: 1 1 507dd7cddfSDavid du Colombier# NTPSOct95 begin 517dd7cddfSDavid du Colombier# <text> 527dd7cddfSDavid du Colombier# showpage 537dd7cddfSDavid du Colombier# end 547dd7cddfSDavid du Colombier# %%Page: 2 2 557dd7cddfSDavid du Colombier# NTPSOct95 begin 567dd7cddfSDavid du Colombier# <text> 577dd7cddfSDavid du Colombier# showpage 587dd7cddfSDavid du Colombier# end 597dd7cddfSDavid du Colombier# ...... 607dd7cddfSDavid du Colombier# %%Trailer 617dd7cddfSDavid du Colombier# ... 627dd7cddfSDavid du Colombier# %%EOF 637dd7cddfSDavid du Colombier# 647dd7cddfSDavid du Colombier# That is the dictionary opening is repeated inside each page. 657dd7cddfSDavid du Colombier# 667dd7cddfSDavid du Colombier# We add a comment to the document to mark that it has been converted. 677dd7cddfSDavid du Colombier# This has the form 687dd7cddfSDavid du Colombier# %LOCALGhostviewPatched 697dd7cddfSDavid du Colombier# 707dd7cddfSDavid du Colombier# Usage: 717dd7cddfSDavid du Colombier# fixmswrd [-v] [file [output-file]] 727dd7cddfSDavid du Colombier 737dd7cddfSDavid du Colombierrequire 'getopts.pl'; 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier#================================================================= 767dd7cddfSDavid du Colombier 777dd7cddfSDavid du Colombier$program = "fixmswrd"; 787dd7cddfSDavid du Colombier 797dd7cddfSDavid du Colombiersub usage { 807dd7cddfSDavid du Colombier die "Usage: $program [-v] [file [output-file]]\n"; 817dd7cddfSDavid du Colombier} 827dd7cddfSDavid du Colombier 837dd7cddfSDavid du Colombier#================================================================= 847dd7cddfSDavid du Colombier 857dd7cddfSDavid du Colombier&Getopts("v") || &usage; 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier$verbose = $opt_v; 887dd7cddfSDavid du Colombier 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier$infile = shift(@ARGV); 917dd7cddfSDavid du Colombierif ($infile) 927dd7cddfSDavid du Colombier{ 937dd7cddfSDavid du Colombier open(INFILE, $infile) || die "$program: Cannot read from $infile\n"; 947dd7cddfSDavid du Colombier $handle = "INFILE"; 957dd7cddfSDavid du Colombier} 967dd7cddfSDavid du Colombierelse 977dd7cddfSDavid du Colombier{ 987dd7cddfSDavid du Colombier $handle = "STDIN"; 997dd7cddfSDavid du Colombier} 1007dd7cddfSDavid du Colombier 1017dd7cddfSDavid du Colombier 1027dd7cddfSDavid du Colombier$outfile = shift(@ARGV); 1037dd7cddfSDavid du Colombierif ($outfile) 1047dd7cddfSDavid du Colombier{ 1057dd7cddfSDavid du Colombier open(OUTFILE, ">$outfile") || die "$program: Cannot write to $outfile\n"; 1067dd7cddfSDavid du Colombier select(OUTFILE); 1077dd7cddfSDavid du Colombier} 1087dd7cddfSDavid du Colombier 1097dd7cddfSDavid du Colombier# This reads the header comments and detects the presence of the marker. 1107dd7cddfSDavid du Colombier$have_marker = 0; 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombierundef $dict_name; 1137dd7cddfSDavid du Colombierundef $dict_line; 1147dd7cddfSDavid du Colombier 1157dd7cddfSDavid du Colombier&read_comments; 1167dd7cddfSDavid du Colombier&put_comments; 1177dd7cddfSDavid du Colombier 1187dd7cddfSDavid du Colombierif ($have_marker) 1197dd7cddfSDavid du Colombier{ 1207dd7cddfSDavid du Colombier $verbose && print STDERR "$program: Warning - already converted\n"; 1217dd7cddfSDavid du Colombier 1227dd7cddfSDavid du Colombier while(<$handle>) # pass the file through unchanged. 1237dd7cddfSDavid du Colombier { 1247dd7cddfSDavid du Colombier print; 1257dd7cddfSDavid du Colombier } 1267dd7cddfSDavid du Colombier} 1277dd7cddfSDavid du Colombierelse 1287dd7cddfSDavid du Colombier{ 1297dd7cddfSDavid du Colombier $seen_trailer = 0; 1307dd7cddfSDavid du Colombier 1317dd7cddfSDavid du Colombier while(<$handle>) # massage the file 1327dd7cddfSDavid du Colombier { 1337dd7cddfSDavid du Colombier if ($dict_line) 1347dd7cddfSDavid du Colombier { 1357dd7cddfSDavid du Colombier next if (/$dict_line/o); # drop the old begin line 1367dd7cddfSDavid du Colombier $seen_trailer = 1 if (/^%%Trailer/); 1377dd7cddfSDavid du Colombier next if ($seen_trailer and /^end/); # drop the old end line 1387dd7cddfSDavid du Colombier } 1397dd7cddfSDavid du Colombier 1407dd7cddfSDavid du Colombier print; 1417dd7cddfSDavid du Colombier 1427dd7cddfSDavid du Colombier if (/^%%Page:/) 1437dd7cddfSDavid du Colombier { 1447dd7cddfSDavid du Colombier print "$dict_name begin\n"; # add at the start of the page 1457dd7cddfSDavid du Colombier } 1467dd7cddfSDavid du Colombier elsif (/^showpage/) 1477dd7cddfSDavid du Colombier { 1487dd7cddfSDavid du Colombier print "end\n"; # add at the end of the page 1497dd7cddfSDavid du Colombier } 1507dd7cddfSDavid du Colombier elsif (/^%%BeginResource: procset (\S+)/) 1517dd7cddfSDavid du Colombier { 1527dd7cddfSDavid du Colombier $dict_name = $1; 1537dd7cddfSDavid du Colombier $dict_line = "^$dict_name begin"; 1547dd7cddfSDavid du Colombier } 1557dd7cddfSDavid du Colombier elsif (/^%%BeginProcSet: (\S+)/) # for older document versions 1567dd7cddfSDavid du Colombier { 1577dd7cddfSDavid du Colombier $dict_name = $1; 1587dd7cddfSDavid du Colombier $dict_line = "^$dict_name begin"; 1597dd7cddfSDavid du Colombier } 1607dd7cddfSDavid du Colombier elsif (/^%%EndProlog:/) 1617dd7cddfSDavid du Colombier { 1627dd7cddfSDavid du Colombier unless ($dict_line) 1637dd7cddfSDavid du Colombier { 1647dd7cddfSDavid du Colombier $verbose && 1657dd7cddfSDavid du Colombier print STDERR "$program: Warning - unrecognised document structure\n"; 1667dd7cddfSDavid du Colombier } 1677dd7cddfSDavid du Colombier } 1687dd7cddfSDavid du Colombier } 1697dd7cddfSDavid du Colombier} 1707dd7cddfSDavid du Colombier 1717dd7cddfSDavid du Colombierexit 0; 1727dd7cddfSDavid du Colombier 1737dd7cddfSDavid du Colombier#================================================================= 1747dd7cddfSDavid du Colombier 1757dd7cddfSDavid du Colombier 1767dd7cddfSDavid du Colombier# This reads all of the header comments into an array which we can write 1777dd7cddfSDavid du Colombier# out again later. In addition we detect the presence of the marker comment. 1787dd7cddfSDavid du Colombier 1797dd7cddfSDavid du Colombiersub read_comments 1807dd7cddfSDavid du Colombier{ 1817dd7cddfSDavid du Colombier @headers = (); 1827dd7cddfSDavid du Colombier 1837dd7cddfSDavid du Colombier while (<$handle>) 1847dd7cddfSDavid du Colombier { # without chopping 1857dd7cddfSDavid du Colombier push(@headers, $_); 1867dd7cddfSDavid du Colombier if (/^%LOCALGhostviewPatched/) 1877dd7cddfSDavid du Colombier { 1887dd7cddfSDavid du Colombier $have_marker = 1; 1897dd7cddfSDavid du Colombier } 1907dd7cddfSDavid du Colombier last if /^%%EndComments/; 1917dd7cddfSDavid du Colombier } 1927dd7cddfSDavid du Colombier} 1937dd7cddfSDavid du Colombier 1947dd7cddfSDavid du Colombier 1957dd7cddfSDavid du Colombier 1967dd7cddfSDavid du Colombiersub put_comments 1977dd7cddfSDavid du Colombier{ 1987dd7cddfSDavid du Colombier foreach $h (@headers) 1997dd7cddfSDavid du Colombier { 2007dd7cddfSDavid du Colombier if (!$have_marker and ($h =~ /^%%EndComments/)) 2017dd7cddfSDavid du Colombier { 2027dd7cddfSDavid du Colombier print "%LOCALGhostviewPatched\n"; 2037dd7cddfSDavid du Colombier } 2047dd7cddfSDavid du Colombier print $h; # contains the newline 2057dd7cddfSDavid du Colombier } 2067dd7cddfSDavid du Colombier} 207