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"); |