From b27c97a50ac5da8fda1b9a42756dff53866e8d75 Mon Sep 17 00:00:00 2001 From: John Whitington Date: Wed, 11 Sep 2024 15:15:35 +0100 Subject: [PATCH] Marking artifacts --- cpdfcommand.ml | 4 ++-- cpdfdraw.ml | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/cpdfcommand.ml b/cpdfcommand.ml index 601a178..3992981 100644 --- a/cpdfcommand.ml +++ b/cpdfcommand.ml @@ -2828,8 +2828,8 @@ let specs = ("-use", Arg.String Cpdfdrawcontrol.usexobj, " Use a saved sequence of graphics operators"); ("-draw-jpeg", Arg.String Cpdfdrawcontrol.addjpeg, " Load a JPEG from file and name it"); ("-draw-png", Arg.String Cpdfdrawcontrol.addpng, " Load a PNG from file and name it"); - ("-image", Arg.String (fun s -> Cpdfdrawcontrol.addimage ?title:args.image_title s), " Draw an image which has already been loaded"); - ("-image-title", Arg.String (fun s -> args.image_title <- Some s), " Give title for future images"); + ("-image", Arg.String (fun s -> Cpdfdrawcontrol.addimage ?title:args.image_title s; args.image_title <- None), " Draw an image which has already been loaded"); + ("-image-title", Arg.String (fun s -> args.image_title <- Some s), " Give title for the next -image"); ("-fill-opacity", Arg.Float Cpdfdrawcontrol.addopacity, " Set opacity"); ("-stroke-opacity", Arg.Float Cpdfdrawcontrol.addsopacity, " Set stroke opacity"); ("-bt", Arg.Unit Cpdfdrawcontrol.addbt, " Begin text"); diff --git a/cpdfdraw.ml b/cpdfdraw.ml index e512e0b..6dc81bb 100644 --- a/cpdfdraw.ml +++ b/cpdfdraw.ml @@ -395,6 +395,31 @@ let save_whole_stack () = let restore_whole_stack r = resstack := r +(* Mark as an artifact anything not already marked. *) +let add_artifacts ops = + let content = ref false in + let artifact = ref false in + let rec loop a = function + | [] -> + (* The end. Must end artifact if in artifact. *) + if !artifact then rev (Pdfops.Op_EMC::a) else rev a + | Pdfops.Op_BDC _ as h::t -> + (* Entering content. If in artifact, must end artifact. *) + let a' = if !artifact then h::Pdfops.Op_EMC::a else h::a in + set content; clear artifact; loop a' t + | Pdfops.Op_EMC as h::t -> + (* Exiting content. *) + clear content; + loop (h::a) t + | h::t -> + (* A normal operation. If not in content or artifact must start artifact. *) + let a' = + if not (!content || !artifact) then (set artifact; h::Pdfops.Op_BMC "/Artifact"::a) else h::a + in + loop a' t + in + loop [] ops + let draw_single ~fast ~underneath ~filename ~bates ~batespad range pdf drawops = (res ()).num <- max (res ()).num (minimum_resource_number pdf range); let endpage = Pdfpage.endpage pdf in @@ -420,6 +445,7 @@ let draw_single ~fast ~underneath ~filename ~bates ~batespad range pdf drawops = map3 (fun n p ops -> if not (mem n range) then p else + let ops = add_artifacts ops in 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)