Article View: comp.os.msdos.apps
Article #3246Re: Postscript files in WordPerfect 5.1
From: Bjarne Hansen
Date: Tue, 26 Jan 1993 19:57
Date: Tue, 26 Jan 1993 19:57
393 lines
12904 bytes
12904 bytes
In article <1993Jan22.213806.6123@sol.UVic.CA> rhorner@ugly.UVic.CA (Roger
Horner) writes:
> ...
> I then uploaded the postscript file to the unix machine with kermit
> in text mode and tried to print it. The printer gave an error
> message (C5 I think), and then removed the file from the queue without
> printing anything.
>
> I have a friend who successfully printed the a file created in
> MS-Word using a similar technique. I compared his and my postscript
> files and mine seems to have a slightly different format, but both
> files can be displayed successfully with ghostscript.
>
> Roger Horner (rhorner@sirius.UVic.ca) University of Victoria
> 4th Year Electrical Engineering Student Victoria, BC, Canada
>
I don't know what the error codes on your particular printer mean, but
we have struggled in the past with printing PostScript files exported
from various DOS programs (CorelDraw and WP51 come to mind). In each
case the printer (a NEC LC-890) consistently choked on the PS file,
regardless of whether it was brought over to our network via Kermit,
FTP, or floppy.
We discovered that the files that wouldn't print had unprintable
characters (often a control-D together with other assorted control
characters) at the beginning and/or at the end of the file. Once
these were removed, the files printed OK. You can check whether the
file you had problems with is corrupted the same way by opening it
with an editor capable of displaying control characters. Under
Unix, vi or emacs will work. The start of a PS file should look
something like:
%!PS-Adobe-1.0
%%comments and document details
%%more comments and document details
..
( if you want more detailed info, the 'PostScript Language Reference
Manual' by Adobe Systems Inc, Addison-Wesley Publishing Co., will
tell you more than you want to know :-)
Solution: If this is why your file isn't printing, then try deleting
all the unprintable characters. The above editors can do this, or you
can use the program below. Cut out the C code and compile it either
on your PC or on a Unix machine (I tested it with MS-QuickC 2.51 on
a PC, and with the compiler on our Silicon Graphics. Both work.)
To use, type 'isps postscript_print_file output_file' and 'output_file'
will be created from 'postscript_print_file' minus the nasty
characters.
Hope this helps with your problem. If not, email me a copy of the
PS file. If you need a copy of the isps executable, let me know...
Bjarne Hansen <bhansen@valve.heart.rri.uwo.ca>
or NeXTmail at <bhansen@next2god.heart.rri.uwo.ca>
The axis of the earth sticks out visibly through the centre of each
and every town or city. Oliver Wendell Holmes 1809-1894.
(especially Toronto...)
====================================================================
Sorry about the lines longer than 80 characters - hard not to exceed
in a program. If the text is too messed up to make sense of, I can
email, or repost without the tabs...
---------------------cut here-----isps.c source code------------------
/* isps.c accepts two arguments, an input filename and an output
filename. It reads the first 2 characters of the input file
and if they are "%!", it assumes that it is a Postscript file.
Return codes are:
0 - No errors, file is not Postscript
1 - No filename or more than one supplied as arguments
2 - Error in opening filename (e.g. doesn't exist)
3 - Couldn't allocate enough memory for the file buffer
4 - File had embedded control characters, and doesn't
appear to be Postscript
5 - File had embedded control characters, but appears to
be Postscript
6 - File is Postscript
Some CorelDraw files seem to include a <CTRL>D as the first
character. To get around this, the program will scan the 1st
256 characters for the strings "%!" and "PS" if the initial
%! is not found. WordPerfect generated PS files have also
been observed that contain control characters.
Written by Bjarne Hansen. 4-1318 Highbury Ave, London, Ont,
Canada N5Y 5E5. bhansen@valve.heart.RRI.UWO.CA
You may freely distribute and use this program, but may not
charge any fee for doing so. Any modified versions of this
program are subject to the same conditions.
Last modified 25 Jan 93.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <malloc.h>
#include <string.h>
#include <errno.h>
#define TRUE 1
#define FALSE 0
#define VERSION 1.04
#define KEYWORDS_THRESHOLD 13 /*# PS keywords to declare file PS*/
#define NUM_KEYWORDS 13
#define MIN_BUF_SIZE 1000 /*arbitrary min buffer for PS file*/
typedef short int Boolean;
extern int main( int argc, char *argv[])
{
FILE *fptr, *fptr2;
char *buf, *tmp_buf_ptr;
char keywords[NUM_KEYWORDS][12] = { "{",
"}",
" def",
" dup",
" pop",
" exch",
" dict",
" bind",
" lineto",
" moveto",
" newpath",
" stroke",
" showpage"
};
Boolean First_Time_Thru = TRUE;
Boolean Found_Ctrl_Chr = FALSE;
Boolean Found_PS = FALSE, Found_PS_in_middle = FALSE;
Boolean Found_Trailer = FALSE;
Boolean Verbose = FALSE;
int i, j, num_keywords_found = 0, num_end = 0;
long int file_length, buf_length = 40000;
size_t num_char_read, num_char_written;
if( argc == 4 && (argv[3][0] == '/') &&
(toupper(argv[3][1]) == 'V') )
Verbose = TRUE;
if( argc == 3 || (argc == 4 && Verbose) )
{ if( (fptr = fopen(argv[1], "rb")) &&
(fptr2 = fopen(argv[2], "wb")) )
{ fseek(fptr, (long)0, SEEK_END);
file_length = ftell(fptr);
rewind(fptr);
if( Verbose ) printf("Length = %ld\n",
file_length);
/*use the length of the file as buffer size, or*/
/*40000, whichever is less*/
if( file_length < buf_length )
buf_length = file_length;
/* Dynamically allocate a large file buffer.*/
/* If there's not enough memory for it, cut the*/
/* buffer size in half and try again.*/
while( (buf = (char *)malloc( (size_t)buf_length
)) == NULL )
{ buf_length /= 2;
if( buf_length < MIN_BUF_SIZE )
{ fprintf( stderr, "Can't allocate
enough memory for the file buffer.\n");
exit( 3 );
}
}
/*Read in file to buffer, changing non-printable*/
/*characters to whitespace*/
/*Rewrite the file to 'outputfile'.Repeat until
EOF */
while( !ferror(fptr) && !feof(fptr) &&
!ferror(fptr2) && !feof(fptr2) )
{ num_char_read = fread( buf, 1, (size_t)
buf_length-1, fptr );
buf[num_char_read] = '\0';
/*change buf to a string for string fcns*/
for( i = 0; i < num_char_read-1; i++ )
{ if( !isprint( buf[i] ) && ( buf[i] !=
0xa) && ( buf[i] != 0xd) && (buf[i] != 0x9) )
{ buf[i] = ' '; /*CTRL chrs to
whitespace*/
Found_Ctrl_Chr = TRUE;
}
}
if( First_Time_Thru )
{ /*check 1st two char for '%!'*/
if( buf[0] == '%' && buf[1] == '!'
)
{ Found_PS = TRUE;
}else
{ /*look for strings "%!"
followed by "PS"*/
if( ((tmp_buf_ptr =
strstr( buf, "%!") ) != NULL) && (strstr( tmp_buf_ptr, "PS") != NULL) )
{ /*seems to be PS, so
put 1st two */
/*char to "%!" and
whitespace the */
/*rest up to
tmp_buf_ptr+2 */
buf[0] = '%';
buf[1] = '!';
for( i = 2; i <
tmp_buf_ptr - buf + 2; i++ )
{ buf[i] = ' ';
}
Found_PS_in_middle
= TRUE;
}
/*count # keywords in 1st
2000 chars */
for( i=0; i<NUM_KEYWORDS;
i++)
{ tmp_buf_ptr = buf;
if( Verbose )
printf("counting keyword %s", keywords[i]);
j = 0;
do
{ tmp_buf_ptr =
strstr( tmp_buf_ptr+1, keywords[i]);
j++;
}while(
(tmp_buf_ptr != NULL) && ((tmp_buf_ptr - buf) < 2000) );
j--;
if( Verbose )
printf(" - %d instances\n", j);
num_keywords_found
+= j;
}
} /*end of else, when '%!' are
not 1st */
/*two chrs in file*/
First_Time_Thru = FALSE;
} /*end of 1st time thru checks*/
/*look for %%Trailer*/
if( (tmp_buf_ptr = strstr(buf,
"%%Trailer")) != NULL )
{ if( Verbose ) printf("found Trailer
comment.\n");
Found_Trailer = TRUE;
/*search for "end" */
if( (tmp_buf_ptr =
strstr(tmp_buf_ptr, "end")) != NULL )
{ if( Verbose ) printf("found
'end'.\n");
*(tmp_buf_ptr + 3) = '\0';
strcat( buf,
"\nshowpage\n");
}else
{ if( Verbose ) printf("did not
find 'end'.\n");
tmp_buf_ptr = strstr(buf,
"%%Trailer");
*(tmp_buf_ptr + 9) = '\0';
strcat( buf,
"\nshowpage\n");
}
}else
{ /*did not find a %%Trailer*/
}
/*write the changed buffer to output file
*/
num_char_written = fwrite( buf, 1,
strlen(buf), fptr2 );
} /*end of while that reads in file, writes out
*/
if( ferror(fptr) )
{ fclose(fptr);
fclose(fptr2);
fprintf(stderr, "Error occurred while
reading file.\n");
exit( 2 );
}else if( ferror(fptr2) | feof(fptr2) )
{ fclose(fptr);
fclose(fptr2);
fprintf(stderr, "Error occurred while
writing file.\n");
exit( 2 );
}else if( feof(fptr) )
{ /*finished reading in file, ctrl chrs to '
'*/
/*and writing to output file.*/
fclose(fptr);
fclose(fptr2);
/*now check the various flags to decide
what */
/*type of file it is*/
if( Found_PS )
{ if( Verbose )
{ printf("Found 'percent-bang'
as 1st two characters in the file.\n");
if( Found_Ctrl_Chr )
printf("Found
non-printable characters in file. They were removed.\n");
printf("It is
PostScript.\n");
}
if( Found_Ctrl_Chr )
exit( 5 );
else
exit( 6 );
}else if( Found_PS_in_middle )
{ if( Verbose )
{ printf("Found 'percent-bang',
but not as 1st two characters in the file.\n");
if( Found_Ctrl_Chr )
printf("Found
non-printable characters in file. They were removed.\n");
printf("Found %d instances
of PostScript keywords in file.\n", num_keywords_found);
if( num_keywords_found >
KEYWORDS_THRESHOLD )
printf("It is
PostScript.\n");
else
printf("It is not
PostScript.\n");
}
if( num_keywords_found >
KEYWORDS_THRESHOLD )
exit( 5 );
else
exit( 4 );
}else if( num_keywords_found
>KEYWORDS_THRESHOLD )
{ if( Verbose )
{ printf("Found %d instances of
PostScript keywords in file.\n", num_keywords_found);
printf("It is
PostScript.\n");
}
exit( 5 );
}else
{ if( Verbose ) printf("File is not
PostScript.\n");
exit( 0 );
}
}
} /*end of if that tried to open file */
else
{ printf( "Error in opening file %s.\n", argv[1] );
exit( 2 );
}
} /*end of if that checked command-line parameters rec'd*/
else
{ printf("\n\nISPS - Checks text files to determine if they are
PostScript.\n");
printf("Corrects some irregularities and rewrites the file
to 'outputfile'.\n");
printf("Version %4.2f by Bjarne Hansen\n\n", VERSION);
printf("Return codes are:\n");
printf("\t0 - No errors, file is not Postscript\n");
printf("\t1 - No filename or more than one supplied as
arguments\n");
printf("\t2 - Error in opening filename (e.g. doesn't
exist)\n");
printf("\t3 - Couldn't allocate enough memory for the file
buffer\n");
printf("\t4 - File had too few PS characteristics to be
sure it is Postscript\n");
printf("\t5 - File had extraneous characters, but appears
to be Postscript\n");
printf("\t6 - File is Postscript\n\n");
printf("Syntax: %s filetotest outputfile
[/V[erbose]]\n\n", argv[0] );
exit( 1 );
}
} /*end of isps.c */
------------------------------end----------------------------------------
Technical Details
Message-ID:
<1993Jan26.195734.9080@julian.uwo.ca>Path:
arc1-ca.pugleaf.net!sparky!uunet!tcsi.com!iat.holonet.net!news.cerf.net!usc!cs.utexas.edu!torn!newshost.uwo.ca!newsReferences:
<1993Jan22.213806.6123@sol.UVic.CA>Show Full Headers
Complete Article Headers
Newsgroups: comp.os.msdos.apps Path: arc1-ca.pugleaf.net!sparky!uunet!tcsi.com!iat.holonet.net!news.cerf.net!usc!cs.utexas.edu!torn!newshost.uwo.ca!news From: bhansen@valve.heart.rri.uwo.ca (Bjarne Hansen) Subject: Re: Postscript files in WordPerfect 5.1 Reply-To: bhansen@valve.heart.rri.uwo.ca Organization: University of Western Ontario Date: Tue, 26 Jan 1993 19:57:34 GMT Message-ID: <1993Jan26.195734.9080@julian.uwo.ca> References: <1993Jan22.213806.6123@sol.UVic.CA> Keywords: Postscript, printing, control codes Sender: news@julian.uwo.ca (USENET News System) Nntp-Posting-Host: next2god.heart.rri.uwo.ca Lines: 393