⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pbmtoppa.c

📁 linux下将各类格式图片转换工具
💻 C
字号:
/* pbmtoppa.c * program to print a 600 dpi PBM file on the HP DJ820Cse or the HP720 series. * Copyright (c) 1998 Tim Norman.  See LICENSE for details * 2-24-98 */#define _BSD_SOURCE    /* This makes sure strcasecmp() is in string.h */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#include "pbm.h"#include "ppa.h"#include "ppapbm.h"#include "cutswath.h"#include "defaults.h"/* Paper sizes in 600ths of an inch. *//* US is 8.5 in by 11 in */#define USWIDTH  (5100)#define USHEIGHT (6600)/* A4 is 210 mm by 297 mm == 8.27 in by 11.69 in */#define A4WIDTH  (4960)#define A4HEIGHT (7016)int Width;      /* width and height in 600ths of an inch */int Height;int Pwidth;     /* width in bytes */#define MAX_LINES 300ppa_stat printer;static int print_pbm (FILE *in){  char line[1024];  pbm_stat pbm;  int done_page, numpages = 0;  ppa_sweep_data sweeps[2];  int current_sweep, previous_sweep;  ppa_init_job(&printer);  while(make_pbm_stat(&pbm,in))  {    if (pbm.width != Width || pbm.height != Height)     {       fprintf(stderr, "print_pbm(): Input image is not the size "               "of a page for Page %d.\n"               "The input is %dW x %dH, while a page is %dW x %dH pixels.\n"               "Page size is controlled by options and the configuration "               "file.\n",               numpages+1, pbm.width, pbm.height, Width, Height);       return 1;    }    ppa_init_page(&printer);    ppa_load_page(&printer);    sweeps[0].direction = right_to_left;    sweeps[0].next=&sweeps[1];    sweeps[1].direction = left_to_right;    sweeps[1].next=&sweeps[0];    current_sweep=0;    previous_sweep=-1;    done_page=0;    while(!done_page)      switch(cut_pbm_swath(&pbm,&printer,MAX_LINES,&sweeps[current_sweep]))      {      case 0:	fprintf (stderr, "print_pbm(): error calling cut_pbm_swath()\n");	return 1;      case 1:	done_page=1;	break;      case 2:	if(previous_sweep>=0)	{	  ppa_print_sweep(&printer,&sweeps[previous_sweep]);	  free(sweeps[previous_sweep].image_data);	  free(sweeps[previous_sweep].nozzle_data);	}	previous_sweep=current_sweep;	current_sweep= current_sweep==0 ? 1 : 0;	break;      default:	fprintf(stderr,"print_pbm(): unknown return code from cut_pbm_swath()\n");	return 1;      }    if(previous_sweep>=0)    {      sweeps[previous_sweep].next=NULL;      ppa_print_sweep(&printer,&sweeps[previous_sweep]);    }    free(sweeps[0].image_data);    free(sweeps[0].nozzle_data);    free(sweeps[1].image_data);    free(sweeps[1].nozzle_data);    ppa_eject_page(&printer);    /* eat any remaining whitespace */    if(pbm.version==P1)      fgets (line, 1024, in);    numpages++;  }  if (numpages == 0)  {    fprintf (stderr, "No pages printed!\n");    return 1;  }  ppa_end_print(&printer);  fclose (pbm.fptr);  fclose (printer.fptr);  return 0;}static void set_printer_specific_defaults(){  switch(printer.version)  {  case HP720:    printer.marg_diff     = HP720_MARG_DIFF;    printer.bufsize       = HP720_BUFSIZE;    printer.x_offset      = HP720_X_OFFSET;    printer.y_offset      = HP720_Y_OFFSET;    printer.top_margin    = HP720_TOP_MARGIN;    printer.left_margin   = HP720_LEFT_MARGIN;    printer.right_margin  = HP720_RIGHT_MARGIN;    printer.bottom_margin = HP720_BOTTOM_MARGIN;    break;  case HP820:    printer.marg_diff     = HP820_MARG_DIFF;    printer.bufsize       = HP820_BUFSIZE;    printer.x_offset      = HP820_X_OFFSET;    printer.y_offset      = HP820_Y_OFFSET;    printer.top_margin    = HP820_TOP_MARGIN;    printer.left_margin   = HP820_LEFT_MARGIN;    printer.right_margin  = HP820_RIGHT_MARGIN;    printer.bottom_margin = HP820_BOTTOM_MARGIN;    break;  case HP1000:    printer.marg_diff     = HP1000_MARG_DIFF;    printer.bufsize       = HP1000_BUFSIZE;    printer.x_offset      = HP1000_X_OFFSET;    printer.y_offset      = HP1000_Y_OFFSET;    printer.top_margin    = HP1000_TOP_MARGIN;    printer.left_margin   = HP1000_LEFT_MARGIN;    printer.right_margin  = HP1000_RIGHT_MARGIN;    printer.bottom_margin = HP1000_BOTTOM_MARGIN;    break;  default:    fprintf(stderr,"set_printer_defaults(): unknown printer version\n");    exit(1);  }}static void show_usage(const char* const prog){  printf("usage: %s [ options ] [ <infile> [ <outfile> ] ]\n\n",prog);  printf("  Prints a pbm- or pbmraw-format <infile> to HP720/820/1000-format <outfile>.\n\n");  printf("    -v <version>    printer version (720, 820, or 1000)\n");  printf("    -x <xoff>       vertical offset adjustment in 1\"/600\n");  printf("    -y <yoff>       horizontal offset adjustment in 1\"/600\n");  printf("    -t <topmarg>    top margin in 1\"/600    (default: 150 = 0.25\")\n");  printf("    -l <leftmarg>   left margin in 1\"/600   (default: 150 = 0.25\")\n");  printf("    -r <rightmarg>  right margin in 1\"/600  (default: 150 = 0.25\")\n");  printf("    -b <botmarg>    bottom margin in 1\"/600 (default: 150 = 0.25\")\n");  printf("    -s <paper>      paper size (us, a4, default: us)\n");  printf("    -f <cfgfile>    read <cfgfile> as parameters\n\n");  printf("  The -x and -y options accumulate.  The -v option resets the horizontal and\n");  printf("  vertical adjustments to an internal default.  <infile> and <outfile> default\n");  printf("  to stdin and stdout.  '-' is a synonym for stdin and stdout.\n\n");  printf("  Configuration files specified with the '-f' parameter have the following\n  format:\n\n");  printf("    # Comment\n");  printf("    <key1> <value1>\n");  printf("    <key2> <value2>\n");  printf("    [etc.]\n\n");  printf("  Valid keys are 'version', 'xoffset', 'yoffset', 'topmargin', 'leftmargin',\n");  printf("  'rightmargin', 'bottommargin', 'papersize', or any non-null truncated\n");  printf("  version of these words.  Valid values are the same as with the corresponding\n");  printf("  command-line parameters.  Parameters in the configuration file act as though\n");  printf("  the corresponding parameters were substituted, in order, for the '-f'\n");  printf("  parameter which specified the file.\n\n");  printf("  The file /etc/pbmtoppa.conf, if it exists, is processed as a configuration\n");  printf("  file before any command-line parameters are processed.\n\n");}static void parm_version(char* arg){  if(!strcasecmp(arg,"hp720") || !strcmp(arg,"720"))    printer.version=HP720;  else if(!strcasecmp(arg,"hp820") || !strcmp(arg,"820"))    printer.version=HP820;  else if(!strcasecmp(arg,"hp1000") || !strcmp(arg,"1000"))    printer.version=HP1000;  else  {    fprintf(stderr,"parm_version(): unknown printer version '%s'\n",arg);    exit(1);  }  set_printer_specific_defaults();}static void parm_iversion(int arg){  switch(arg)  {  case 720:    printer.version=HP720;    break;  case 820:    printer.version=HP820;    break;  case 1000:    printer.version=HP1000;    break;  default:    {      fprintf(stderr,"parm_iversion(): unknown printer version '%d'\n",arg);      exit(1);    }  }  set_printer_specific_defaults();}static void dump_config(){  printf("version:  ");  switch(printer.version)  {  case HP710:  printf("HP710\n");  break;  case HP720:  printf("HP720\n");  break;  case HP820:  printf("HP820\n");  break;  case HP1000: printf("HP1000\n"); break;  }  printf("x-offset: %d\ny-offset: %d\nmargins:\n top:    %d\n"	 " left:   %d\n right:  %d\n bottom: %d\n",printer.x_offset,	 printer.y_offset,printer.top_margin,printer.left_margin,	 printer.right_margin,printer.bottom_margin);  exit(0);}static void read_config_file(const char* const fname){  FILE* cfgfile=fopen(fname,"r");  char line[1024],key[14],buf[10];  int len,value,lineno=1;  if(!cfgfile)  {    fprintf (stderr, "read_config_file(): couldn't open file '%s'\n", fname);    exit(1);  }  while(fgets(line,1024,cfgfile))  {    if(strchr(line,'#'))      *strchr(line,'#')=0;    switch(sscanf(line,"%13s%9s",key,buf))    {    case 2:      value=atoi(buf);      len=strlen(key);      if(!strncmp(key,"version",len))	parm_iversion(value);      else if(!strncmp(key,"xoffset",len))	printer.x_offset=value;      else if(!strncmp(key,"yoffset",len))	printer.y_offset=value;      else if(!strncmp(key,"topmargin",len))	printer.top_margin=value;      else if(!strncmp(key,"leftmargin",len))	printer.left_margin=value;      else if(!strncmp(key,"rightmargin",len))	printer.right_margin=value;      else if(!strncmp(key,"bottommargin",len))	printer.bottom_margin=value;      else if(!strncmp(key,"papersize",len))      {	if(!strcmp(buf,"us"))	{	  Width = USWIDTH;	  Height = USHEIGHT;	}	else if(!strcmp(buf,"a4"))	{	  Width = A4WIDTH;	  Height = A4HEIGHT;	}	else	{	  fprintf(stderr,"read_config_file(): unknown paper size %s\n",buf);	  exit(1);	}      }      else if(!strcmp(key,"dump"))	dump_config();      else       {	fprintf(stderr,"read_config_file(): unrecognized parameter '%s' (line %d)\n\n",key,lineno);	show_usage("pbmtoppa");	exit(1);      }    case EOF:    case 0: break;    default:      fprintf(stderr,"read_config_file(): error parsing config file (line %d)\n",lineno);      exit(1);    }    lineno++;  }  if(feof(cfgfile))  {    fclose(cfgfile);    return;  }  fprintf(stderr,"read_config_file(): error parsing config file\n");  exit(1);}const char* const defaultcfgfile="/etc/pbmtoppa.conf";int main (int argc, char *argv[]){  int argn;  int got_in=0, got_out=0, do_continue=1;  FILE *in=stdin, *out=stdout;  struct stat tmpstat;  pbm_init(&argc, argv);  printer.version       = DEFAULT_PRINTER;  printer.x_offset      = DEFAULT_X_OFFSET;  printer.y_offset      = DEFAULT_Y_OFFSET;  printer.top_margin    = DEFAULT_TOP_MARGIN;  printer.left_margin   = DEFAULT_LEFT_MARGIN;  printer.right_margin  = DEFAULT_RIGHT_MARGIN;  printer.bottom_margin = DEFAULT_BOTTOM_MARGIN;  printer.DPI           = 600;  Width = USWIDTH;  Height = USHEIGHT;  set_printer_specific_defaults();  if(!stat(defaultcfgfile,&tmpstat))    read_config_file(defaultcfgfile);  for(argn=1; argn<argc; argn++)  {    if(!strcmp(argv[argn],"-h"))    {      show_usage(*argv);      return 0;    }    else if(!strcmp(argv[argn],"-d"))      dump_config();    else if(argn+1<argc)    {      do_continue=1;      if(!strcmp(argv[argn],"-v"))	parm_version(argv[++argn]);      else if(!strcmp(argv[argn],"-x"))	printer.x_offset+=atoi(argv[++argn]);      else if(!strcmp(argv[argn],"-y"))	printer.y_offset+=atoi(argv[++argn]);      else if(!strcmp(argv[argn],"-t"))	printer.top_margin=atoi(argv[++argn]);      else if(!strcmp(argv[argn],"-l"))	printer.left_margin=atoi(argv[++argn]);      else if(!strcmp(argv[argn],"-r"))	printer.right_margin=atoi(argv[++argn]);      else if(!strcmp(argv[argn],"-b"))	printer.bottom_margin=atoi(argv[++argn]);      else if(!strcmp(argv[argn],"-s"))      {	argn++;	if(!strcmp(argv[argn],"us"))	{	  Width = USWIDTH;	  Height = USHEIGHT;	}	else if(!strcmp(argv[argn],"a4"))	{	  Width = A4WIDTH;	  Height = A4HEIGHT;	}	else	{	  fprintf(stderr,"unknown paper size %s\n",argv[argn]);	  return 1;	}      }      else if(!strcmp(argv[argn],"-f"))	read_config_file(argv[++argn]);      else do_continue=0;      if(do_continue) continue;    }    if(!got_in)    {      if (strcmp (argv[argn], "-") == 0)	in = stdin;      else if ((in = fopen (argv[argn], "rb")) == NULL)      {	fprintf (stderr, "main(): couldn't open file '%s'\n", argv[argn]);	return 1;      }      got_in=1;    }    else if(!got_out)    {      if (strcmp (argv[argn], "-") == 0)	out = stdout;      else if ((out = fopen (argv[argn], "wb")) == NULL)      {	fprintf (stderr, "main(): couldn't open file '%s'\n", argv[argn]);	return 1;      }      got_out=1;    }    else    {      fprintf(stderr,"main(): unrecognized parameter '%s'\n",argv[argn]);      show_usage(*argv);      return 1;    }  }  Pwidth=(Width+7)/8;  printer.fptr=out;  return print_pbm (in);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -