From 38e7573350b208e00dedb74077b0ad570d34cf59 Mon Sep 17 00:00:00 2001 From: John Whitington Date: Mon, 10 Mar 2025 13:36:45 +0000 Subject: [PATCH] Outline for remove_struct_tree --- Changes | 4 ++++ cpdfcommand.ml | 8 +++++++- cpdfmanual.pdf | Bin 475364 -> 475431 bytes cpdfua.ml | 2 ++ cpdfua.mli | 3 +++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 812d149..1cca564 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,9 @@ 2.9 (to come) +New features: + +* -remove-struct-tree removes whole structure tree + Extended features: o -obj JSON output diff --git a/cpdfcommand.ml b/cpdfcommand.ml index 2eba76a..ab32cb3 100644 --- a/cpdfcommand.ml +++ b/cpdfcommand.ml @@ -229,6 +229,7 @@ type op = | PrintStructTree | ExtractStructTree | ReplaceStructTree of string + | RemoveStructTree | SetLanguage of string | Redact | Rasterize @@ -385,6 +386,7 @@ let string_of_op = function | PrintStructTree -> "PrintStructTree" | ExtractStructTree -> "ExtractStructTree" | ReplaceStructTree _ -> "ReplaceStructTree" + | RemoveStructTree -> "RemoveStructTree" | SetLanguage _ -> "SetLanguage" | Redact -> "Redact" | Rasterize -> "Rasterize" @@ -959,7 +961,7 @@ let banned banlist = function | OCGRename | OCGList | OCGOrderAll | PrintFontEncoding _ | TableOfContents | Typeset _ | Composition _ | TextWidth _ | SetAnnotations _ | CopyAnnotations _ | ExtractStream _ | ReplaceStream _ | PrintObj _ | ReplaceObj _ | Verify _ | MarkAs _ | RemoveMark _ | ExtractStructTree | ReplaceStructTree _ | SetLanguage _ - | PrintStructTree | Rasterize | OutputImage + | PrintStructTree | Rasterize | OutputImage | RemoveStructTree -> false (* Always allowed *) (* Combine pages is not allowed because we would not know where to get the -recrypt from -- the first or second file? *) @@ -4891,6 +4893,10 @@ let go () = let json = Cpdfyojson.Safe.from_file s in Cpdfua.replace_struct_tree pdf json; write_pdf false pdf + | Some RemoveStructTree -> + let pdf = get_single_pdf args.op false in + Cpdfua.remove_struct_tree pdf; + write_pdf false pdf | Some (SetLanguage s) -> let pdf = get_single_pdf args.op false in Cpdfmetadata.set_language pdf s; diff --git a/cpdfmanual.pdf b/cpdfmanual.pdf index bdde6e365d99eb0abb648aa086f20493d14f62d6..00edfdf9217cf97d989605316daf024385f7bd24 100644 GIT binary patch delta 16284 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 Q!^Ok_LryNHAP)0?07l+DU;qFB delta 16225 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 QhT~@EhNGmEP?CiEe^LTO4gdfE diff --git a/cpdfua.ml b/cpdfua.ml index 1fc2b20..e296d7c 100644 --- a/cpdfua.ml +++ b/cpdfua.ml @@ -1850,3 +1850,5 @@ let create_pdfua2 title pagesize pages = let pdf = {pdf with Pdf.major = 2; Pdf.minor = 0} in mark2 2024 pdf; pdf + +let remove_struct_tree pdf = () diff --git a/cpdfua.mli b/cpdfua.mli index b2912ae..8d1d1b5 100644 --- a/cpdfua.mli +++ b/cpdfua.mli @@ -31,6 +31,9 @@ val extract_struct_tree : Pdf.t -> Cpdfyojson.Safe.t (** Reapply an edited JSON structure tree to its PDF. *) val replace_struct_tree : Pdf.t -> Cpdfyojson.Safe.t -> unit +(** Remove a structure tree entirely from a file, including unmarking marked content. *) +val remove_struct_tree : Pdf.t -> unit + (** Make a blank PDF/UA-1 PDF given a title, paper size, and number of pages. *) val create_pdfua1 : string -> Pdfpaper.t -> int -> Pdf.t