mirror of
https://github.com/johnwhitington/cpdf-source.git
synced 2025-06-05 22:09:39 +02:00
Finishes -contains-javascript and -remove-javascript
This commit is contained in:
2
Makefile
2
Makefile
@ -8,7 +8,7 @@ DOC = cpdfutil cpdfunicodedata cpdferror cpdfdebug cpdfjson cpdfstrftime \
|
|||||||
cpdfdraft cpdfspot cpdfpagelabels cpdfcreate cpdfannot cpdfxobject \
|
cpdfdraft cpdfspot cpdfpagelabels cpdfcreate cpdfannot cpdfxobject \
|
||||||
cpdfimpose cpdfchop cpdftweak cpdfprinttree cpdfua cpdftexttopdf \
|
cpdfimpose cpdfchop cpdftweak cpdfprinttree cpdfua cpdftexttopdf \
|
||||||
cpdftoc cpdfjpeg cpdfjpeg2000 cpdfpng cpdfimage cpdfdraw \
|
cpdftoc cpdfjpeg cpdfjpeg2000 cpdfpng cpdfimage cpdfdraw \
|
||||||
cpdfcomposition cpdfshape cpdfcolours cpdfdrawcontrol cpdfform \
|
cpdfcomposition cpdfshape cpdfcolours cpdfdrawcontrol cpdfform cpdfjs \
|
||||||
cpdfcommand
|
cpdfcommand
|
||||||
|
|
||||||
MODS = $(NONDOC) $(DOC)
|
MODS = $(NONDOC) $(DOC)
|
||||||
|
@ -3829,40 +3829,6 @@ let write_images device res quality boxname annots antialias downsample spec pdf
|
|||||||
(ilist 1 endpage);
|
(ilist 1 endpage);
|
||||||
Sys.remove tmppdf
|
Sys.remove tmppdf
|
||||||
|
|
||||||
let remove_javascript pdf =
|
|
||||||
(* Find /S /JavaScript and empty the /JS string. Also, Empty out any /URI (javascript). *)
|
|
||||||
Pdf.objselfmap (fun o -> o) pdf;
|
|
||||||
(* Process the /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 *)
|
(* Main function *)
|
||||||
let go () =
|
let go () =
|
||||||
check_bookmarks_mistake ();
|
check_bookmarks_mistake ();
|
||||||
@ -5031,11 +4997,11 @@ let go () =
|
|||||||
write_pdf false pdf
|
write_pdf false pdf
|
||||||
| Some RemoveJavaScript ->
|
| Some RemoveJavaScript ->
|
||||||
let pdf = get_single_pdf args.op false in
|
let pdf = get_single_pdf args.op false in
|
||||||
remove_javascript pdf;
|
Cpdfjs.remove_javascript pdf;
|
||||||
write_pdf false pdf
|
write_pdf false pdf
|
||||||
| Some ContainsJavaScript ->
|
| Some ContainsJavaScript ->
|
||||||
let pdf = get_single_pdf args.op true in
|
let pdf = get_single_pdf args.op true in
|
||||||
contains_javascript pdf
|
print_string (Printf.sprintf "%b" (Cpdfjs.contains_javascript pdf))
|
||||||
|
|
||||||
(* 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. *)
|
||||||
|
51
cpdfjs.ml
Normal file
51
cpdfjs.ml
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
open Pdfutil
|
||||||
|
|
||||||
|
(* Empty any /JS string, Empty any /URI (javascript:). *)
|
||||||
|
let remove_javascript pdf =
|
||||||
|
let rec remove_javascript_single_object f pdf = function
|
||||||
|
| (Pdf.Dictionary d) -> f (Pdf.recurse_dict (remove_javascript_single_object f pdf) d)
|
||||||
|
| (Pdf.Stream {contents = (Pdf.Dictionary dict, data)}) ->
|
||||||
|
f (Pdf.Stream {contents = (Pdf.recurse_dict (remove_javascript_single_object f pdf) dict, data)})
|
||||||
|
| Pdf.Array a -> Pdf.recurse_array (remove_javascript_single_object f pdf) a
|
||||||
|
| x -> x
|
||||||
|
in
|
||||||
|
let f d =
|
||||||
|
let d =
|
||||||
|
match Pdf.lookup_direct pdf "/JS" d with
|
||||||
|
| Some _ -> Pdf.add_dict_entry d "/JS" (Pdf.String "")
|
||||||
|
| None -> d
|
||||||
|
in
|
||||||
|
match Pdf.lookup_direct pdf "/URI" d with
|
||||||
|
| Some (Pdf.String s) when String.length s >= 11 && String.sub s 0 11 = "javascript:" -> Pdf.add_dict_entry d "/URI" (Pdf.String "")
|
||||||
|
| _ -> d
|
||||||
|
in
|
||||||
|
Pdf.objselfmap (remove_javascript_single_object f pdf) pdf;
|
||||||
|
ignore (Pdf.remove_chain pdf ["/Root"; "/Names"; "/JavaScript"])
|
||||||
|
|
||||||
|
(* Any dictionary with /S /JavaScript or any /URI (javascript:...) *)
|
||||||
|
let contains_javascript pdf =
|
||||||
|
let found = ref false in
|
||||||
|
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;
|
||||||
|
!found
|
7
cpdfjs.mli
Normal file
7
cpdfjs.mli
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
(** JavaScript *)
|
||||||
|
|
||||||
|
(** True if a document contains JavaScript *)
|
||||||
|
val contains_javascript : Pdf.t -> bool
|
||||||
|
|
||||||
|
(** Remove JavaScript from a document *)
|
||||||
|
val remove_javascript : Pdf.t -> unit
|
Reference in New Issue
Block a user