From ad25ad22c9c26f509b07ce12e09ebb98b389c43b Mon Sep 17 00:00:00 2001 From: John Whitington Date: Tue, 3 Jun 2025 12:55:52 +0100 Subject: [PATCH] Implementation for contains_javascript --- cpdfcommand.ml | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/cpdfcommand.ml b/cpdfcommand.ml index 6403686..1b4efab 100644 --- a/cpdfcommand.ml +++ b/cpdfcommand.ml @@ -3831,14 +3831,36 @@ let write_images device res quality boxname annots antialias downsample spec pdf let remove_javascript pdf = (* Find /S /JavaScript and empty the /JS string. Also, Empty out any /URI (javascript). *) - Pdf.objselfmap (fun o -> o) pdf + Pdf.objselfmap (fun o -> o) pdf; (* Process the /Root -> /Names -> /JavaScript *) - (*Pdf.remove_chain pdf ["/Root"; "/Names"; "/JavaScript"];*) + ignore (Pdf.remove_chain pdf ["/Root"; "/Names"; "/JavaScript"]) let contains_javascript pdf = let found = ref false in (* Any dictionary with /S /JavaScript or any /URI (javascript:...) *) + let rec contains_javascript_single_object f pdf = function + | (Pdf.Dictionary d) -> f (Pdf.recurse_dict (contains_javascript_single_object f pdf) d) + | (Pdf.Stream {contents = (Pdf.Dictionary dict, data)}) -> + f (Pdf.Stream {contents = (Pdf.recurse_dict (contains_javascript_single_object f pdf) dict, data)}) + | Pdf.Array a -> Pdf.recurse_array (contains_javascript_single_object f pdf) a + | x -> x + in + let f d = + begin match Pdf.lookup_direct pdf "/S" d with + | Some (Pdf.String "/JavaScript") -> set found + | _ -> () + end; + begin match Pdf.lookup_direct pdf "/URI" d with + | Some (Pdf.String s) when String.length s >= 11 && String.sub s 0 11 = "javascript:" -> set found; d + | _ -> d + end + in + Pdf.objiter (fun _ obj -> ignore (contains_javascript_single_object f pdf obj)) pdf; (* Any /Root -> /Names -> /JavaScript *) + begin match Pdf.lookup_chain pdf pdf.Pdf.trailerdict ["/Root"; "/Names"; "/JavaScript"] with + | Some _ -> set found + | None -> () + end; print_string (Printf.sprintf "%b" !found) (* Main function *)