diff options
Diffstat (limited to 'frontend/scanimage.c')
| -rw-r--r-- | frontend/scanimage.c | 198 | 
1 files changed, 162 insertions, 36 deletions
| diff --git a/frontend/scanimage.c b/frontend/scanimage.c index 901a7c8..b587b9d 100644 --- a/frontend/scanimage.c +++ b/frontend/scanimage.c @@ -60,6 +60,10 @@  #include "sicc.h"  #include "stiff.h" +#ifdef HAVE_LIBJPEG +#include "jpegtopdf.h" +#endif +  #include "../include/md5.h"  #ifndef PATH_MAX @@ -119,6 +123,7 @@ static struct option basic_options[] = {  #define OUTPUT_TIFF     2  #define OUTPUT_PNG      3  #define OUTPUT_JPEG     4 +#define OUTPUT_PDF      5  #define BASE_OPTSTRING	"d:hi:Lf:o:B::nvVTAbp"  #define STRIP_HEIGHT	256	/* # lines we increment image height */ @@ -633,6 +638,9 @@ print_option (SANE_Device * device, int opt_num, const SANE_Option_Descriptor *o    else if(!(opt->cap & SANE_CAP_SOFT_SELECT) && (opt->cap & SANE_CAP_SOFT_DETECT))      fputs (" [read-only]", stdout); +  else if (opt->cap & SANE_CAP_ADVANCED) +    fputs (" [advanced]", stdout); +    fputs ("\n        ", stdout);    column = 8; @@ -1328,7 +1336,7 @@ advance (Image * image)  }  static SANE_Status -scan_it (FILE *ofp) +scan_it (FILE *ofp, void* pw)  {    int i, len, first_frame = 1, offset = 0, must_buffer = 0;    uint64_t hundred_percent = 0; @@ -1354,6 +1362,8 @@ scan_it (FILE *ofp)    struct jpeg_error_mgr jerr;  #endif +  (void)pw; +    do      {        if (!first_frame) @@ -1448,6 +1458,14 @@ scan_it (FILE *ofp)  		    break;  #endif  #ifdef HAVE_LIBJPEG +		  case OUTPUT_PDF: +		    sane_pdf_start_page ( pw, parm.pixels_per_line, parm.lines, +		               resolution_value, SANE_PDF_IMAGE_COLOR, +		               SANE_PDF_ROTATE_OFF); +		    write_jpeg_header (parm.format, parm.pixels_per_line, +				       parm.lines, resolution_value, +				       ofp, &cinfo, &jerr); +		    break;  		  case OUTPUT_JPEG:  		    write_jpeg_header (parm.format, parm.pixels_per_line,  				       parm.lines, resolution_value, @@ -1465,7 +1483,7 @@ scan_it (FILE *ofp)  	    pngbuf = malloc(parm.bytes_per_line);  #endif  #ifdef HAVE_LIBJPEG -	  if(output_format == OUTPUT_JPEG) +	  if(output_format == OUTPUT_JPEG || output_format == OUTPUT_PDF)  	    jpegbuf = malloc(parm.bytes_per_line);  #endif @@ -1629,7 +1647,7 @@ scan_it (FILE *ofp)  	      else  #endif  #ifdef HAVE_LIBJPEG -	      if (output_format == OUTPUT_JPEG) +	      if (output_format == OUTPUT_JPEG || output_format == OUTPUT_PDF)  	        {  		  int i = 0;  		  int left = len; @@ -1729,6 +1747,14 @@ scan_it (FILE *ofp)        break;  #endif  #ifdef HAVE_LIBJPEG +      case OUTPUT_PDF: +	sane_pdf_start_page ( pw, parm.pixels_per_line, parm.lines, +	           resolution_value, SANE_PDF_IMAGE_COLOR, +	           SANE_PDF_ROTATE_OFF); +	write_jpeg_header (parm.format, parm.pixels_per_line, +			   parm.lines, resolution_value, +			   ofp, &cinfo, &jerr); +      break;        case OUTPUT_JPEG:  	write_jpeg_header (parm.format, parm.pixels_per_line,  			   parm.lines, resolution_value, @@ -1760,7 +1786,7 @@ scan_it (FILE *ofp)  	png_write_end(png_ptr, info_ptr);  #endif  #ifdef HAVE_LIBJPEG -    if(output_format == OUTPUT_JPEG) +    if(output_format == OUTPUT_JPEG || output_format == OUTPUT_PDF)  	jpeg_finish_compress(&cinfo);  #endif @@ -1775,7 +1801,7 @@ cleanup:    }  #endif  #ifdef HAVE_LIBJPEG -  if(output_format == OUTPUT_JPEG) { +  if(output_format == OUTPUT_JPEG || output_format == OUTPUT_PDF) {      jpeg_destroy_compress(&cinfo);      free(jpegbuf);    } @@ -2017,7 +2043,8 @@ static int guess_output_format(const char* output_file)          { ".jpg", OUTPUT_JPEG },          { ".jpeg", OUTPUT_JPEG },          { ".tiff", OUTPUT_TIFF }, -        { ".tif", OUTPUT_TIFF } +        { ".tif", OUTPUT_TIFF }, +        { ".pdf", OUTPUT_PDF }        };        for (unsigned i = 0; i < sizeof(formats) / sizeof(formats[0]); ++i)          { @@ -2052,6 +2079,7 @@ main (int argc, char **argv)    SANE_Status status;    char *full_optstring;    SANE_Int version_code; +  void *pw = NULL;    FILE *ofp = NULL;    buffer_size = (32 * 1024);	/* default size */ @@ -2155,6 +2183,15 @@ main (int argc, char **argv)  	      exit(1);  #endif  	    } +	  else if (strcmp (optarg, "pdf") == 0) +	    { +#ifdef HAVE_LIBJPEG +	      output_format = OUTPUT_PDF; +#else +	      fprintf(stderr, "PDF support not compiled in\n"); +	      exit(1); +#endif +	    }            else if (strcmp (optarg, "pnm") == 0)              {                output_format = OUTPUT_PNM; @@ -2308,7 +2345,7 @@ standard output.\n\  Parameters are separated by a blank from single-character options (e.g.\n\  -d epson) and by a \"=\" from multi-character options (e.g. --device-name=epson).\n\  -d, --device-name=DEVICE   use a given scanner device (e.g. hp:/dev/scanner)\n\ -    --format=pnm|tiff|png|jpeg  file format of output file\n\ +    --format=pnm|tiff|png|jpeg|pdf  file format of output file\n\  -i, --icc-profile=PROFILE  include this ICC profile into TIFF file\n", prog_name);        printf ("\  -L, --list-devices         show available scanner devices\n\ @@ -2622,6 +2659,9 @@ List of available devices:", prog_name);  	    break;  #endif  #ifdef HAVE_LIBJPEG +	  case OUTPUT_PDF: +	    format = "out%d.pdf"; +	    break;  	  case OUTPUT_JPEG:  	    format = "out%d.jpg";  	    break; @@ -2642,6 +2682,13 @@ List of available devices:", prog_name);                    scanimage_exit(1);                  }              } +#ifdef HAVE_LIBJPEG +         if (output_format == OUTPUT_PDF) +           { +             sane_pdf_open(&pw, ofp ); +             sane_pdf_start_doc( pw ); +           } +#endif          }        if (batch) @@ -2667,11 +2714,14 @@ List of available devices:", prog_name);  	{  	  char path[PATH_MAX];  	  char part_path[PATH_MAX]; -	  if (batch)		/* format is NULL unless batch mode */ +	  if (batch)  /* format is NULL unless batch mode */  	    {  	      sprintf (path, format, n);	/* love --(C++) */  	      strcpy (part_path, path); -	      strcat (part_path, ".part"); +#ifdef HAVE_LIBJPEG +	      if (output_format != OUTPUT_PDF) +#endif +     	         strcat (part_path, ".part");  	    } @@ -2689,6 +2739,13 @@ List of available devices:", prog_name);  		    {  		      if (ofp)  			{ +#ifdef HAVE_LIBJPEG +	                  if (output_format == OUTPUT_PDF) +			    { +		              sane_pdf_end_doc( pw ); +			      sane_pdf_close ( pw ); +			    } +#endif  			  fclose (ofp);  			  ofp = NULL;  			} @@ -2711,8 +2768,15 @@ List of available devices:", prog_name);  	    {  	      fprintf (stderr, "%s: sane_start: %s\n",  		       prog_name, sane_strstatus (status)); -	      if (ofp) +	      if (ofp )  		{ +#ifdef HAVE_LIBJPEG +	          if (output_format == OUTPUT_PDF) +		    { +		       sane_pdf_end_doc( pw ); +		       sane_pdf_close ( pw ); +		     } +#endif  		  fclose (ofp);  		  ofp = NULL;  		} @@ -2723,15 +2787,42 @@ List of available devices:", prog_name);  	  /* write to .part file while scanning is in progress */  	  if (batch)  	    { -	      if (NULL == (ofp = fopen (part_path, "w"))) +#ifdef HAVE_LIBJPEG +	      SANE_Bool init_pdf = SANE_FALSE; +#endif +	      if (ofp == NULL) +	        { +	          ofp = fopen (part_path, "w"); +#ifdef HAVE_LIBJPEG +	          if (output_format == OUTPUT_PDF && ofp != NULL) +	             init_pdf = SANE_TRUE; +#endif +	        } +	      if (NULL == ofp)  		{  		  fprintf (stderr, "cannot open %s\n", part_path);  		  sane_cancel (device);  		  return SANE_STATUS_ACCESS_DENIED;  		} +#ifdef HAVE_LIBJPEG +	      if (init_pdf ) +	        { +		  sane_pdf_open( &pw, ofp ); +		  sane_pdf_start_doc ( pw ); +		} +#endif +	    } + +	  status = scan_it (ofp, pw); + +#ifdef HAVE_LIBJPEG +	  if (output_format == OUTPUT_PDF) +	    { +		  sane_pdf_end_page( pw ); +		  fflush( ofp );  	    } +#endif -	  status = scan_it (ofp);  	  if (batch)  	    {  	      fprintf (stderr, "Scanned page %d.", n); @@ -2745,32 +2836,47 @@ List of available devices:", prog_name);  	      status = SANE_STATUS_GOOD;  	      if (batch)  		{ -		  if (!ofp || 0 != fclose(ofp)) -		    { -		      fprintf (stderr, "cannot close image file\n"); -		      sane_cancel (device); -		      return SANE_STATUS_ACCESS_DENIED; -		    } -		  else +#ifdef HAVE_LIBJPEG +	          if (output_format != OUTPUT_PDF)  		    { -		      ofp = NULL; -		      /* let the fully scanned file show up */ -		      if (rename (part_path, path)) -			{ -			  fprintf (stderr, "cannot rename %s to %s\n", -				part_path, path); -			  sane_cancel (device); -			  return SANE_STATUS_ACCESS_DENIED; -			} -		      if (batch_print) -			{ -			  fprintf (stdout, "%s\n", path); -			  fflush (stdout); -			} +#endif +		      if (!ofp || 0 != fclose(ofp)) +		        { +		           fprintf (stderr, "cannot close image file\n"); +		           sane_cancel (device); +		           return SANE_STATUS_ACCESS_DENIED; +		        } +		      else +		        { +		           ofp = NULL; +		           /* let the fully scanned file show up */ +		           if (rename (part_path, path)) +		             { +		               fprintf (stderr, "cannot rename %s to %s\n", +		                        part_path, path); +			       sane_cancel (device); +			       return SANE_STATUS_ACCESS_DENIED; +			     } +		           if (batch_print) +			     { +			        fprintf (stdout, "%s\n", path); +			        fflush (stdout); +			     } +		        } +#ifdef HAVE_LIBJPEG  		    } +#endif  		}                else                  { +#ifdef HAVE_LIBJPEG +	              if (output_format == OUTPUT_PDF) +		            { +			          sane_pdf_end_doc( pw ); +			          fflush( ofp ); +			          sane_pdf_close ( pw ); +			        } +#endif                    if (output_file && ofp)                      {                        fclose(ofp); @@ -2783,13 +2889,20 @@ List of available devices:", prog_name);  		{  		  if (ofp)  		    { -		      fclose (ofp); -		      ofp = NULL; -		    } +		          fclose (ofp); +		          ofp = NULL; +			}  		  unlink (part_path);  		}                else                  { +#ifdef HAVE_LIBJPEG +                  if (output_format == OUTPUT_PDF) +                    { +                       sane_pdf_end_doc( pw ); +                       sane_pdf_close ( pw ); +                    } +#endif                    if (output_file && ofp)                      {                        fclose(ofp); @@ -2807,6 +2920,19 @@ List of available devices:", prog_name);        if (batch)  	{ +#ifdef HAVE_LIBJPEG +	  if (output_format == OUTPUT_PDF) +            { +	      if (output_file && ofp) +	        { +	          sane_pdf_end_doc( pw ); +	          fflush( ofp ); +	          sane_pdf_close ( pw ); +                  fclose(ofp); +                  ofp = NULL; +		} +	    } +#endif  	  int num_pgs = (n - batch_start_at) / batch_increment;  	  fprintf (stderr, "Batch terminated, %d page%s scanned\n",  		   num_pgs, num_pgs == 1 ? "" : "s"); | 
