mirror of
				https://github.com/johnwhitington/cpdf-source.git
				synced 2025-06-05 22:09:39 +02:00 
			
		
		
		
	First stab at write_images
This commit is contained in:
		| @@ -565,7 +565,8 @@ type args = | |||||||
|    mutable rast_device : string; |    mutable rast_device : string; | ||||||
|    mutable rast_res : float; |    mutable rast_res : float; | ||||||
|    mutable rast_annots : bool; |    mutable rast_annots : bool; | ||||||
|    mutable rast_antialias : bool} |    mutable rast_antialias : bool; | ||||||
|  |    mutable rast_jpeg_quality : int} | ||||||
|  |  | ||||||
| let args = | let args = | ||||||
|   {op = None; |   {op = None; | ||||||
| @@ -710,7 +711,8 @@ let args = | |||||||
|    rast_device = "png16m"; |    rast_device = "png16m"; | ||||||
|    rast_res = 144.; |    rast_res = 144.; | ||||||
|    rast_annots = false; |    rast_annots = false; | ||||||
|    rast_antialias = true} |    rast_antialias = true; | ||||||
|  |    rast_jpeg_quality = 75} | ||||||
|  |  | ||||||
| (* Do not reset original_filename or cpdflin or was_encrypted or | (* Do not reset original_filename or cpdflin or was_encrypted or | ||||||
| was_decrypted_with_owner or recrypt or producer or creator or path_to_* or | was_decrypted_with_owner or recrypt or producer or creator or path_to_* or | ||||||
| @@ -841,7 +843,8 @@ let reset_arguments () = | |||||||
|   args.rast_device <- "png16m"; |   args.rast_device <- "png16m"; | ||||||
|   args.rast_res <- 144.; |   args.rast_res <- 144.; | ||||||
|   args.rast_annots <- false; |   args.rast_annots <- false; | ||||||
|   args.rast_antialias <- true |   args.rast_antialias <- true; | ||||||
|  |   args.rast_jpeg_quality <- 75 | ||||||
|  |  | ||||||
| (* Prefer a) the one given with -cpdflin b) a local cpdflin, c) otherwise assume | (* Prefer a) the one given with -cpdflin b) a local cpdflin, c) otherwise assume | ||||||
| installed at a system place *) | installed at a system place *) | ||||||
| @@ -3012,6 +3015,7 @@ let specs = | |||||||
|    ("-rasterize-res", Arg.Float (fun f -> args.rast_res <- f), " Rastierization resolution"); |    ("-rasterize-res", Arg.Float (fun f -> args.rast_res <- f), " Rastierization resolution"); | ||||||
|    ("-rasterize-annots", Arg.Unit (fun () -> args.rast_annots <- true), " Rasterize annotations"); |    ("-rasterize-annots", Arg.Unit (fun () -> args.rast_annots <- true), " Rasterize annotations"); | ||||||
|    ("-rasterize-no-antialias", Arg.Unit (fun () -> args.rast_antialias <- false), " Don't antialias when rasterizing"); |    ("-rasterize-no-antialias", Arg.Unit (fun () -> args.rast_antialias <- false), " Don't antialias when rasterizing"); | ||||||
|  |    ("-rasterize-jpeg-quality", Arg.Int (fun i -> args.rast_jpeg_quality <- i), " Set JPEG quality"); | ||||||
|    ("-output-jpeg", Arg.String (fun s -> args.op <- Some (OutputImage ("JPG" ^ s))), " Output pages as JPEGs"); |    ("-output-jpeg", Arg.String (fun s -> args.op <- Some (OutputImage ("JPG" ^ s))), " Output pages as JPEGs"); | ||||||
|    ("-output-png", Arg.String (fun s -> args.op <- Some (OutputImage ("PNG" ^ s))), " Output pages as PNGs"); |    ("-output-png", Arg.String (fun s -> args.op <- Some (OutputImage ("PNG" ^ s))), " Output pages as PNGs"); | ||||||
|    (* These items are undocumented *) |    (* These items are undocumented *) | ||||||
| @@ -3684,7 +3688,7 @@ let rasterize antialias device res annots pdf range = | |||||||
|             ((if args.gs_quiet then ["-dQUIET"] else []) @ |             ((if args.gs_quiet then ["-dQUIET"] else []) @ | ||||||
|             ["-dBATCH"; "-dNOPAUSE"; "-dSAFER"; "-dTextAlphaBits=" ^ antialias; "-dGraphicsAlphaBits=" ^ antialias; |             ["-dBATCH"; "-dNOPAUSE"; "-dSAFER"; "-dTextAlphaBits=" ^ antialias; "-dGraphicsAlphaBits=" ^ antialias; | ||||||
|              "-sDEVICE=" ^ device; "-dUseCropBox"; "-dShowAnnots=" ^ string_of_bool annots; |              "-sDEVICE=" ^ device; "-dUseCropBox"; "-dShowAnnots=" ^ string_of_bool annots; | ||||||
|              "-sOUTPUTFILE=" ^ tmpout; "-sPageList=" ^ string_of_int pnum; "-r" ^ string_of_float res; tmppdf]) |              "-sOutputFile=" ^ tmpout; "-sPageList=" ^ string_of_int pnum; "-r" ^ string_of_float res; tmppdf]) | ||||||
|         in |         in | ||||||
|           Printf.printf "CALL: %S\n" gscall; |           Printf.printf "CALL: %S\n" gscall; | ||||||
|           begin match Sys.command gscall with |           begin match Sys.command gscall with | ||||||
| @@ -3733,8 +3737,41 @@ let rasterize antialias device res annots pdf range = | |||||||
|     Sys.remove tmppdf; |     Sys.remove tmppdf; | ||||||
|     pdf |     pdf | ||||||
|  |  | ||||||
| let write_images spec pdf range = | let write_images res quality boxname gray mono annots antialias spec pdf range = | ||||||
|   () |   let box = if boxname = None then "" else "-dUse" ^ (implode (tl (explode (unopt boxname)))) in | ||||||
|  |   if args.path_to_ghostscript = "" then begin | ||||||
|  |     Pdfe.log "Please supply path to gs with -gs\n"; | ||||||
|  |     exit 2 | ||||||
|  |   end; | ||||||
|  |   let tmppdf = Filename.temp_file "cpdf" ".pdf" in | ||||||
|  |   tempfiles := tmppdf::!tempfiles; | ||||||
|  |   Pdfwrite.pdf_to_file pdf tmppdf; | ||||||
|  |   iter2 | ||||||
|  |     (fun page pnum -> | ||||||
|  |        if not (mem pnum range) then () else | ||||||
|  |        let device, out = | ||||||
|  |          match explode spec with | ||||||
|  |          | 'P'::'N'::'G'::t -> (if gray then "pnggray" else if mono then "pngmono" else "png16m"), implode t | ||||||
|  |          | 'J'::'P'::'G'::t -> (if gray then "jpeggray" else "jpeg"), implode t | ||||||
|  |          | _ -> assert false | ||||||
|  |        in | ||||||
|  |        let out = Cpdfbookmarks.name_of_spec Cpdfmetadata.UTF8 [] pdf 0 out pnum "" 0 0 in | ||||||
|  |        let antialias = if antialias then "4" else "1" in | ||||||
|  |        let gscall = | ||||||
|  |          Filename.quote_command args.path_to_ghostscript | ||||||
|  |            ((if args.gs_quiet then ["-dQUIET"] else []) @ | ||||||
|  |            ["-dBATCH"; "-dNOPAUSE"; "-dSAFER"; "-dTextAlphaBits=" ^ antialias; "-dGraphicsAlphaBits=" ^ antialias; | ||||||
|  |             "-sDEVICE=" ^ device; box; "-dShowAnnots=" ^ string_of_bool annots; "-dJPEGQ=" ^ string_of_int quality; | ||||||
|  |             "-sOutputFile=" ^ out; "-sPageList=" ^ string_of_int pnum; "-r" ^ string_of_float res; tmppdf]) | ||||||
|  |        in | ||||||
|  |          Printf.printf "CALL: %S\n" gscall; | ||||||
|  |          begin match Sys.command gscall with | ||||||
|  |          | 0 -> () | ||||||
|  |          | _ -> Pdfe.log "Rasterization failed\n"; exit 2 | ||||||
|  |          end) | ||||||
|  |     (Pdfpage.pages_of_pagetree pdf) | ||||||
|  |     (ilist 1 (Pdfpage.endpage pdf)); | ||||||
|  |   Sys.remove tmppdf | ||||||
|  |  | ||||||
| (* Main function *) | (* Main function *) | ||||||
| let go () = | let go () = | ||||||
| @@ -4846,7 +4883,9 @@ let go () = | |||||||
|   | Some (OutputImage spec) -> |   | Some (OutputImage spec) -> | ||||||
|       let pdf = get_single_pdf args.op false in |       let pdf = get_single_pdf args.op false in | ||||||
|       let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in |       let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in | ||||||
|         write_images spec pdf range |         write_images | ||||||
|  |           args.rast_res args.rast_jpeg_quality args.tobox (args.rast_device = "pnggray") (args.rast_device = "pngmono") | ||||||
|  |           args.rast_annots args.rast_antialias spec pdf range | ||||||
|  |  | ||||||
| (* Advise the user if a combination of command line flags makes little sense, | (* Advise the user if a combination of command line flags makes little sense, | ||||||
| or error out if it make no sense at all. *) | or error out if it make no sense at all. *) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user