[comp.lang.postscript] Postscript manual-feed envelope program

deb@svax.cs.cornell.edu (David Baraff) (01/31/88)

Here's a program I use for printing envelopes on an Apple Laser
Writer. It uses the manualfeed option, so you can insert envelopes
into the manual feed. (Actually, push the envelope in until something
inside grabs it. You'll here a click. Then wait a second, and when
it actually starts feeding it in, help it if needed).

I find this produces really good looking envelopes (professional!)
if you use heavy paper for your envelopes. Anyway, here it is
in case you find it useful. Cut out the program below, stick
it in a file (e.g. 'psenv.c') and simply

	$ cc psenv.c -o psenv
		and
	$ psenv adr-file | lpr -Ppostscript	(or whatever)

Any comments appreciated.

-----------------------------Cut Here---------------------------------------

/*
	David Baraff
	Cornell University

	Output postscript suitable for an Apple LaserWriter
	to print addresses on envelopes (using manual feed).
	The envelopes are put in with the upper (long) edge
	parallel to the left edge of the manual feed tray.
	Note that the text is rotated 90 degrees to account
	for this.

	I found that "heav-duty" enveloped (e.g. thick yellowish
	ones) comd out much better than ordinary white ones, which
	have a tendency to either wrinkle or (worse) seal themselves!
	(Well, one could always put the letter in the envelope first,
	thereby saving even more time!)

	-------------------------------------------------------------

	An entry in the input file consists of a return address
	followed by a sender address, seperated by a line containing only
	a '.'. There may be any number of entries in the input
	file, each seperated also by a line containing only a '.'.

	Each entry generates a seperate envelope.

	E.g.:
		John Q. Public
		13 Main Ave.
		Smalltown, KA. 12343
		.
		Zippy Pinhead
		516 Flatstreet
		San Jose, CA. 96524
		.
		Jane Doe
		(etc)
		.
		Tom Smith
		(etc)

	Usage:
		psenv [file]

	If file is not present, the standard input is read. Postscript
	output is produced on the standard output, and a count of
	envelopes is written to standard error.

	Enjoy!
*/

#include	<stdio.h>

#define	FROM_HOFFSET		.5		/* return address position */
#define FROM_VOFFSET		.5		/* (in inches) */

#define TO_HOFFSET		4.25		/* sendee addres position */
#define TO_VOFFSET		2.5		/* (in inches) */

#define FONT			"Helvetica"	/* Must be a valid postscript
						   font name */

#define PS			12		/* point size (in points) */
#define VS			14		/* vertical size (in points) */

static char s[256];
char *readline(f)
	FILE *f;
{
	if(fgets(s, 256, f) == NULL)
		return NULL;

	if(s[strlen(s) - 1] == '\n')		/* remove newlines */
		s[strlen(s) - 1] = '\0';

	if(strlen(s) == 1 && s[0] == '.')	/* item seperator */
		return NULL;

	return s;
}

main(argc, argv)
	int argc;
	char *argv[];
{
	FILE	*input = stdin;
	int	ctr = 0;
	char	*readline(), *buffer;

	if(argc > 2)
	{
		fprintf(stderr, "Usage: %s [file]\n", argv[0]);
		exit(-1);
	}

	if(argc == 2)
		if((input = fopen(argv[1], "r")) == NULL)
		{
			fprintf(stderr, "%s: Cannot read address file '%s'\n",
				argv[0], argv[1]);
			exit(-1);
		}

	printf("%%!	*** Automatic Envelope Program ***\n");
	printf("%%	David Baraff\n");
	printf("%%	Cornell University\n\n");
	printf("%%%% Begin Prolog\n\n");
	printf("statusdict begin currentdict /manualfeed true put end\n");
	printf("/inch { 72 mul } def\n");
	printf("-90.0 rotate\n");
	printf("-11.0 inch 0 inch translate\n");
	printf("/%s findfont %d scalefont setfont\n", FONT, PS);
	printf("%%%% End Prolog\n\n");

	while(!feof(input))
	{
		double	xpos = FROM_HOFFSET,
			ypos = FROM_VOFFSET;
		int	wrote_something = 0;

		printf("%%%% Envelope #%d\n\n", ++ctr);

		while((buffer = readline(input)) != NULL)
		{
			wrote_something = 1;
			printf("%g inch %g inch moveto (%s) show\n",
				xpos, 8.5 - ypos, buffer);
			ypos += (1./72.) * VS;
		}

		xpos = TO_HOFFSET;
		ypos = TO_VOFFSET;

		while((buffer = readline(input)) != NULL)
		{
			wrote_something = 1;
			printf("%g inch %g inch moveto (%s) show\n",
				xpos, 8.5 - ypos, buffer);
			ypos += (1./72.) * VS;
		}

		if(wrote_something)
			printf("\ngsave showpage grestore\n\n");
		else
			ctr--;
	}

	fprintf(stderr, "[Printing %d envelopes on standard output]\n", ctr);
}
----------------------Cut Here------------------------------------

	David Baraff		deb@svax.cs.cornell.edu
	Program of Computer Graphics
	Cornell University