📄 psmanager.c
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved. *//* PSMANAGER: $Revision: 1.4 $ ; $Date: 1998/08/04 16:41:54 $ */#include "par.h"/*********************** self documentation **********************/char *sdoc[] = {" "," PSMANAGER - printer MANAGER for HP 4MV and HP 5Si Mx Laserjet "," PostScript printing "," "," psmanager < stdin [optional parameters] > stdout "," "," Required Parameters: "," none "," Optional Parameters: "," papersize=0 paper size (US Letter default) "," =1 US Legal "," =2 A4 "," =3 11x17 "," "," orient=0 paper orientation (Portrait default) "," =1 Landscape "," "," tray=3 printing tray (Bottom tray default) "," =1 tray 1 (multipurpose slot) "," =2 tray 2 "," "," manual=0 no manual feed "," =1 (Manual Feed) "," "," media=0 regular paper "," =1 Transparency "," =2 Letterhead "," =3 Card Stock "," =4 Bond "," =5 Labels "," =6 Prepunched "," =7 Recyled "," =8 Preprinted "," =9 Color (printing on colored paper) "," "," Notes: "," The option manual=1 implies tray=1. The media options apply "," only to the HP LaserJet 5Si MX model printer. "," "," Examples: "," overheads: "," psmanager < postscript_file manual=1 media=1 | lpr "," labels: "," psmanager < postscript_file manual=1 media=5 | lpr "," ",NULL};/* * Notes: This code was reverse engineered using output from * the NeXTStep printer manager. * * Author: John Stockwell, June 1995, October 1997 * * Reference: * PostScript Printer Description File Format Specification, * version 4.2, Adobe Systems Incorporated *//**************** end self doc ********************************//* Statically defined strings */static char *letter = {"<</DeferredMediaSelection true /PageRegion [612 792] /ImagingBBox null>> setpagedevice"};static char *legal = {"<</DeferredMediaSelection true /PageRegion [612 1008] /ImagingBBox null>> setpagedevice"};static char *tabloid = {"<</DeferredMediaSelection true /PageRegion [792 1224] /ImagingBBox null>> setpagedevice"};static char *a4 = {"<</DeferredMediaSelection true /PageRegion [595 842] /ImagingBBox null>> setpagedevice"};static char *cass = {"<</DeferredMediaSelection true /MediaPosition 0>> setpagedevice"};static char *lcass = {"<</DeferredMediaSelection true /MediaPosition 1>> setpagedevice"};static char *mp = {"<</DeferredMediaSelection true /MediaPosition 3>> setpagedevice"};static char *none = {"<</DeferredMediaSelection true /MediaType null>> setpagedevice"}; static char *preprinted = {"<</DeferredMediaSelection true /MediaType (Preprinted)>> setpagedevice"}; static char *letterhead = {"<</DeferredMediaSelection true /MediaType (Letterhead)>> setpagedevice"}; static char *transparency = {"<</DeferredMediaSelection true /MediaType (Transparency)>> setpagedevice"}; static char *prepunched = {"<</DeferredMediaSelection true /MediaType (Prepunched)>> setpagedevice"}; static char *labels = {"<</DeferredMediaSelection true /MediaType (Labels)>> setpagedevice"}; static char *bond = {"<</DeferredMediaSelection true /MediaType (Bond)>> setpagedevice"}; static char *recycled = {"<</DeferredMediaSelection true /MediaType (Recycled)>> setpagedevice"}; static char *color = {"<</DeferredMediaSelection true /MediaType (Color)>> setpagedevice"}; static char *cardstock = {"<</DeferredMediaSelection true /MediaType (Card Stock)>> setpagedevice"}; /* Statically defined integer arrays */static int letterdim[] = {612,792};static int legaldim[] = {612,1008};static int tabloiddim[] = {792,1224};static int a4dim[] = {595,842};/* Prototypes of subroutines used internally */void pstitle(int pages);void documentPaperSizes(char *size);void orientation(char *direction);void endProlog(int pages);void space(void);void grestore(void);void gsave(void);void showpage(void);void setUserDict(int count);void clearUserDict(void);void setUpPage(char *pagestr, char *papersizestr, char *mediastr, char *mediatypestr, int orient, int manual, char *slotstr, char *traystr, int *pagedim, int llx, int lly, int urx,int ury, float pllx,float plly, float purx, float pury, int pages);void pageTrailer(int *pagedim, int orient, float pllx, float plly, float purx, float pury);int main (int argc, char **argv){ int papersize; /* print papersize */ int media; /* paper media */ int orient; /* portrait or landscape */ int tray; /* paper tray */ int manual; /* manual feed */ cwp_String papersizestr=NULL; /* papersize name */ cwp_String mediatypestr=NULL; /* media type name */ cwp_String mediastr=NULL; /* media name */ cwp_String orientstr=NULL; /* orientation name */ cwp_String traystr=NULL; /* tray name */ cwp_String slotstr=NULL; /* input slot name */ char line[BUFSIZ]; /* one line in input */ int llx=0; /* BoundingBox lower left x */ int lly=0; /* ... ... ... y */ int urx=0; /* ... upper right x */ int ury=0; /* ... ... ... y */ int pages=1; /* pages in output */ int count=0; /* page counter */ int oldcount=0; /* temporary page counter */ float fllx=0.; /* BoundingBox lower left x */ float flly=0.; /* ... ... ... y */ float furx=0.; /* ... upper right x */ float fury=0.; /* ... ... ... y */ float pllx; /* PageBoundingBox parameters */ float plly; float purx; float pury; int pagedim[2]; /* dimensions of page */ char *pagestr=NULL; /* page style instructions */ FILE *infp=stdin; /* input file pointer */ FILE *outfp=stdout; /* output file pointer */ FILE *tmpfp; /* tempfile pointer */ /* Initialize getpar */ initargs(argc,argv); requestdoc(1); /* Get parameters */ if (!getparint("papersize",&papersize)) papersize = 0 ; if (!getparint("orient",&orient)) orient = 0; if (!getparint("tray",&tray)) tray = 3; if (!getparint("manual",&manual)) manual = 0; if (!getparint("media",&media)) media = 0; /* Manual feed */ if (manual) { tray=1; traystr=mp; } /* Set up the tray */ if (tray==2) { slotstr="Cassette"; traystr=cass; } else if (tray==1) { slotstr="MP"; traystr=mp; } else if (tray==3) { slotstr="LargeCapacity"; traystr=lcass; } else { err("Unsupported tray, %d", tray); } /* Set up identifying strings for orientation */ if (orient==0) { orientstr="Portrait"; } else if (orient==1) { orientstr="Landscape"; } else { err("Unsupported orientation, %d", orient); } /* Set up identifying strings for papersize types */ if (papersize==0) { papersizestr="Letter"; pagestr=letter; if (orient==0){ pagedim[0] = letterdim[0]; pagedim[1] = letterdim[1]; } else { pagedim[0] = letterdim[1]; pagedim[1] = letterdim[0]; } } else if (papersize==1) { papersizestr="Legal"; pagestr=legal; if (orient==0){ pagedim[0] = legaldim[0]; pagedim[1] = legaldim[1]; } else { pagedim[0] = legaldim[1]; pagedim[1] = legaldim[0]; } } else if (papersize==2) { papersizestr="A4"; pagestr=a4; if (orient==0){ pagedim[0] = a4dim[0]; pagedim[1] = a4dim[1]; } else { pagedim[0] = a4dim[1]; pagedim[1] = a4dim[0]; } } else if (papersize==3) { papersizestr="Tabloid"; pagestr=tabloid;; if (orient==0){ pagedim[0] = tabloiddim[0]; pagedim[1] = tabloiddim[1]; } else { pagedim[0] = tabloiddim[1]; pagedim[1] = tabloiddim[0]; } } else { err("Unsupported papersize selection, %d", papersize); }/* Statically defined integer arrays */ /* Get paper media */ if (media==0) { mediatypestr="None"; mediastr=none; } else if (media==1) { mediatypestr="Transparency"; mediastr=transparency; } else if (media==2) { mediatypestr="Letterhead"; mediastr=letterhead; } else if (media==3) { mediatypestr="Card Stock"; mediastr=cardstock; } else if (media==4) { mediatypestr="Bond"; mediastr=bond; } else if (media==5) { mediatypestr="Labels"; mediastr=labels; } else if (media==6) { mediatypestr="Prepunched"; mediastr=prepunched; } else if (media==7) { mediatypestr="Recycled"; mediastr=recycled; } else if (media==8) { mediatypestr="Preprinted"; mediastr=preprinted; } else if (media==9) { mediatypestr="Color"; mediastr=color; } else { err("Unsupported media selection, %d", media); } /* Open tempfile */ tmpfp = etmpfile(); rewind(tmpfp); /* Read input line by line and capture BoundingBox info */ while (fgets(line,BUFSIZ,infp)!=NULL){ /* If the line begins with a % */ if (line[0] == '%'){ /* if BoundingBox */ if (strstr(line,"%%BoundingBox:")!=NULL) { /* if BoundingBox: (atend) skip to next line */ if (strstr(line,"atend")!=NULL) continue; /* capture BoundingBox values */ if (sscanf(line,"%*s %d %d %d %d", &llx,&lly,&urx,&ury)==4) { /* integers read */ } else if (sscanf(line,"%*s %f %f %f %f", &fllx,&flly,&furx,&fury)==4) { /* read floats and convert */ llx = NINT(fllx); lly = NINT(flly); urx = NINT(furx); ury = NINT(fury); } else { err("Error reading BoundingBox!"); } } /* if Pages: */ if (strstr(line,"%%Pages:")!=NULL) { /* capture number of pages values */ if (sscanf(line,"%*s %d", &pages)==1); } } /* Write line to tmpfile */ fputs(line,tmpfp); } /* Rewind tempfile */ rewind(tmpfp); /* Compute PageBoundingBox dimensions */ pllx = (pagedim[0] - urx + llx)/2.0; plly = (pagedim[1] - ury + lly)/2.0; purx = urx - llx + pllx; pury = ury - lly + plly; /* begin creating PostScript wrapper */ pstitle(pages); /* DocumentPapersizes */ documentPaperSizes(papersizestr); /* Orientation */ orientation(orientstr); /* End Prolog */ endProlog(pages); /* Setup page */ setUpPage(pagestr,papersizestr,mediastr,mediatypestr, orient,manual,slotstr,traystr,pagedim, llx,lly,urx,ury,pllx, plly,purx,pury,pages);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -