diff --git a/cpdfcommand.ml b/cpdfcommand.ml index 64af924..3e99c8c 100644 --- a/cpdfcommand.ml +++ b/cpdfcommand.ml @@ -4467,7 +4467,7 @@ let go () = let ops = match !drawops with [("_MAIN", ops)] -> rev ops | _ -> error "not enough -end-xobj or -et" in write_pdf false - (Cpdfdraw.draw ~filename:args.original_filename ~bates:args.bates ~batespad:args.batespad args.fast range pdf ops) + (Cpdfdraw.draw ~fast:args.fast ~filename:args.original_filename ~bates:args.bates ~batespad:args.batespad args.fast range pdf ops) | Some (Composition json) -> let pdf = get_single_pdf args.op false in let filesize = diff --git a/cpdfdraw.ml b/cpdfdraw.ml index d648e1f..993c256 100644 --- a/cpdfdraw.ml +++ b/cpdfdraw.ml @@ -293,39 +293,37 @@ let minimum_resource_number pdf range = let contains_specials drawops = List.exists (function SpecialText _ -> true | _ -> false) drawops -let draw_single ~filename ~bates ~batespad fast range pdf drawops = +let draw_single ~fast ~underneath ~filename ~bates ~batespad fast range pdf drawops = (res ()).num <- max (res ()).num (minimum_resource_number pdf range); let endpage = Pdfpage.endpage pdf in let pages = Pdfpage.pages_of_pagetree pdf in - let str = + let ops = if contains_specials drawops then None - else Some (Pdfops.string_of_ops (ops_of_drawops pdf endpage filename bates batespad 0 (hd pages) drawops)) + else Some (ops_of_drawops pdf endpage filename bates batespad 0 (hd pages) drawops) in let ss = map2 (fun n p -> if mem n range - then (match str with Some x -> x | None -> Pdfops.string_of_ops (ops_of_drawops pdf endpage filename bates batespad n p drawops)) - else "") + then (match ops with Some x -> x | None -> ops_of_drawops pdf endpage filename bates batespad n p drawops) + else []) (ilist 1 endpage) pages in - let pdf = ref pdf in - iter2 - (fun n s -> Printf.printf "Page %i\n%!" n; if mem n range then pdf := Cpdftweak.append_page_content s false fast [n] !pdf) - (ilist 1 endpage) - ss; - let pdf = !pdf in let pages = - map2 - (fun n p -> if not (mem n range) then p else {p with Pdfpage.resources = update_resources pdf p.Pdfpage.resources}) + map3 + (fun n p ops -> + if not (mem n range) then p else + let page = {p with Pdfpage.resources = update_resources pdf p.Pdfpage.resources} in + (if underneath then Pdfpage.prepend_operators else Pdfpage.postpend_operators) pdf ops ~fast page) (ilist 1 endpage) (Pdfpage.pages_of_pagetree pdf) + ss in Pdfpage.change_pages true pdf pages -let draw ~filename ~bates ~batespad fast range pdf drawops = +let draw ?(fast=false) ?(underneath=false) ~filename ~bates ~batespad fast range pdf drawops = resstack := [empty_res ()]; (res ()).time <- Cpdfstrftime.current_time (); let pdf = ref pdf in @@ -335,7 +333,7 @@ let draw ~filename ~bates ~batespad fast range pdf drawops = let chunks = ref (split_around (eq NewPage) drawops) in while !chunks <> [] do reset_state (); - if hd !chunks <> [] then pdf := draw_single ~filename ~bates ~batespad fast !range !pdf (hd !chunks); + if hd !chunks <> [] then pdf := draw_single ~fast ~underneath ~filename ~bates ~batespad fast !range !pdf (hd !chunks); chunks := tl !chunks; if !chunks <> [] then begin let endpage = Pdfpage.endpage !pdf in diff --git a/cpdfdraw.mli b/cpdfdraw.mli index 04cd45e..3b9194a 100644 --- a/cpdfdraw.mli +++ b/cpdfdraw.mli @@ -45,7 +45,9 @@ type drawops = | RenderMode of int | Rise of float -val draw : filename:string -> +val draw : ?fast:bool -> + ?underneath:bool -> + filename:string -> bates:int -> batespad:int option -> bool -> int list -> Pdf.t -> drawops list -> Pdf.t diff --git a/cpdfmanual.tex b/cpdfmanual.tex index 4d81b45..09315e3 100644 --- a/cpdfmanual.tex +++ b/cpdfmanual.tex @@ -15,6 +15,7 @@ %Document -open-at-page-custom %Document -text-width %Error handling for png /jpeg loaders +%-underneath for -draw \documentclass{book} % Edit here to produce cpdfmanual.pdf, cpdflibmanual.pdf, pycpdfmanual.pdf, % dotnetcpdflibmanual.pdf, jcpdflibmanual.pdf jscpdflibmanual.pdf etc.