From e918630ea42088d818f847b34fa77ba229a329a2 Mon Sep 17 00:00:00 2001 From: John Whitington Date: Wed, 27 Oct 2021 18:55:52 +0100 Subject: [PATCH] beginning JSON annotations --- cpdf.ml | 58 -------------------------------------------------- cpdf.mli | 3 --- cpdfcommand.ml | 29 ++++++++++++++----------- cpdfmanual.tex | 1 + 4 files changed, 17 insertions(+), 74 deletions(-) diff --git a/cpdf.ml b/cpdf.ml index aecadb8..d5dfac2 100644 --- a/cpdf.ml +++ b/cpdf.ml @@ -2640,64 +2640,6 @@ let get_annotations encoding pdf = pages (ilist 1 (length pages))) -let list_annotations_more pdf = - let pages = Pdfpage.pages_of_pagetree pdf in - iter2 - (fun page pagenumber -> - iter - (function annot -> - let print_annot annot = - let annot_type_string = - match annot.Pdfannot.subtype with - | Pdfannot.Stamp -> "Stamp" - | Pdfannot.Text -> "Text" - | Pdfannot.Link -> "Link" - | Pdfannot.FreeText -> "FreeText" - | Pdfannot.Line -> "Line" - | Pdfannot.Square -> "Square" - | Pdfannot.Circle -> "Circle" - | Pdfannot.Polygon -> "Polygon" - | Pdfannot.PolyLine -> "PolyLine" - | Pdfannot.Highlight -> "Highlight" - | Pdfannot.Underline -> "Underline" - | Pdfannot.Squiggly -> "Squiggly" - | Pdfannot.StrikeOut -> "StrikeOut" - | Pdfannot.Caret -> "Caret" - | Pdfannot.Ink -> "Ink" - | Pdfannot.Popup _ -> "Popup" - | Pdfannot.FileAttachment -> "FileAttachment" - | Pdfannot.Sound -> "Sound" - | Pdfannot.Movie -> "Movie" - | Pdfannot.Widget -> "Widget" - | Pdfannot.Screen -> "Screen" - | Pdfannot.PrinterMark -> "PrinterMark" - | Pdfannot.TrapNet -> "TrapNet" - | Pdfannot.Watermark -> "Watermark" - | Pdfannot.ThreeDee -> "ThreeDee" - | Pdfannot.Unknown -> "Unknown" - in let subject = - match annot.Pdfannot.subject with - | Some s -> s - | None -> "" - in let contents = - match annot.Pdfannot.annot_contents with - | Some s -> s - | None -> "" - in - Printf.printf "Page: %i\n" pagenumber; - Printf.printf "Subtype: %s\n" annot_type_string; - Printf.printf "Subject: %s\n" subject; - Printf.printf "Contents: %s\n" contents; - in - match annot.Pdfannot.subtype with - | Pdfannot.Popup annot -> print_annot annot - | _ -> print_annot annot - ) - (Pdfannot.annotations_of_page pdf page)) - pages - (ilist 1 (length pages)); - flprint "" (* flush *) - (* Equalise the page lengths of two PDFs by chopping or extending the first one. *) let equalise_lengths a b = diff --git a/cpdf.mli b/cpdf.mli index d28ac69..5e21c7b 100644 --- a/cpdf.mli +++ b/cpdf.mli @@ -303,9 +303,6 @@ val padmultiple : int -> Pdf.t -> Pdf.t (** List the annotations to standard output in a given encoding. See cpdfmanual.pdf for the format details. *) val list_annotations : encoding -> Pdf.t -> unit -(** The same, but giving more information. Deprecated *) -val list_annotations_more : Pdf.t -> unit - (** Return the annotations as a (pagenumber, content) list *) val get_annotations : encoding -> Pdf.t -> (int * string) list diff --git a/cpdfcommand.ml b/cpdfcommand.ml index efe0eb6..840edf4 100644 --- a/cpdfcommand.ml +++ b/cpdfcommand.ml @@ -107,7 +107,6 @@ type op = | DumpAttachedFiles | RemoveAnnotations | ListAnnotations - | ListAnnotationsMore | CopyAnnotations of string | Merge | Split @@ -233,7 +232,6 @@ let string_of_op = function | DumpAttachedFiles -> "DumpAttachedFiles" | RemoveAnnotations -> "RemoveAnnotations" | ListAnnotations -> "ListAnnotations" - | ListAnnotationsMore -> "ListAnnotationsMore" | CopyAnnotations _ -> "CopyAnnotations" | Merge -> "Merge" | Split -> "Split" @@ -465,7 +463,7 @@ type args = mutable impose_margin : float; mutable impose_spacing : float; mutable impose_linewidth : float; - mutable bookmarks_json : bool} + mutable format_json : bool} let args = {op = None; @@ -579,7 +577,7 @@ let args = impose_margin = 0.; impose_spacing = 0.; impose_linewidth = 0.; - bookmarks_json = false} + format_json = false} let reset_arguments () = args.op <- None; @@ -678,7 +676,7 @@ let reset_arguments () = args.impose_margin <- 0.; args.impose_spacing <- 0.; args.impose_linewidth <- 0.; - args.bookmarks_json <- false + args.format_json <- false (* Do not reset original_filename or cpdflin or was_encrypted or * was_decrypted_with_owner or recrypt or producer or creator or path_to_* or * gs_malformed or gs_quiet, since we want these to work across ANDs. Or @@ -727,7 +725,7 @@ bans list in the input file, the operation cannot proceed. Other operations cannot proceed at all without owner password. *) let banned banlist = function | Fonts | Info | Metadata | PageInfo | Revisions | CountPages - | ListAttachedFiles | ListAnnotationsMore | ListAnnotations + | ListAttachedFiles | ListAnnotations | ListBookmarks | ImageResolution _ | MissingFonts | PrintPageLabels | Clean | Compress | Decompress | RemoveUnusedResources | ChangeId | CopyId _ | ListSpotColours | Version @@ -1066,11 +1064,15 @@ let setaddbookmarks s = let setaddbookmarksjson s = setop (AddBookmarks s) (); - args.bookmarks_json <- true + args.format_json <- true -let setlistbookmarksjson s = +let setlistbookmarksjson () = setop ListBookmarks (); - args.bookmarks_json <- true + args.format_json <- true + +let setlistannotationsjson () = + setop ListBookmarks (); + args.format_json <- true let setstampon f = setop (StampOn f) (); @@ -2025,6 +2027,9 @@ and specs = ("-list-annotations", Arg.Unit (setop ListAnnotations), " List annotations"); + ("-list-annotations-json", + Arg.Unit setlistannotationsjson, + " List annotations in JSON format"); ("-copy-annotations", Arg.String setcopyannotations, " Copy annotations from given file"); @@ -3448,7 +3453,7 @@ let go () = | (_, pagespec, _, _, _, _)::_, _ -> let pdf = get_single_pdf args.op true in let range = parse_pagespec_allow_empty pdf pagespec in - Cpdf.list_bookmarks args.bookmarks_json args.encoding range pdf (Pdfio.output_of_channel stdout); + Cpdf.list_bookmarks args.format_json args.encoding range pdf (Pdfio.output_of_channel stdout); flush stdout | _ -> error "list-bookmarks: bad command line" end @@ -3835,8 +3840,6 @@ let go () = end | Some ListAnnotations -> Cpdf.list_annotations args.encoding (get_single_pdf args.op true) - | Some ListAnnotationsMore -> - Cpdf.list_annotations_more (get_single_pdf args.op true) | Some Shift -> let pdf = get_single_pdf args.op false in let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in @@ -3967,7 +3970,7 @@ let go () = args.relative_to_cropbox args.underneath range pdf) | Some (AddBookmarks file) -> write_pdf false - (Cpdf.add_bookmarks ~json:args.bookmarks_json true (Pdfio.input_of_channel (open_in_bin file)) + (Cpdf.add_bookmarks ~json:args.format_json true (Pdfio.input_of_channel (open_in_bin file)) (get_single_pdf args.op false)) | Some RemoveBookmarks -> write_pdf false (Pdfmarks.remove_bookmarks (get_single_pdf args.op false)) diff --git a/cpdfmanual.tex b/cpdfmanual.tex index 73d873e..32481ed 100644 --- a/cpdfmanual.tex +++ b/cpdfmanual.tex @@ -3,6 +3,7 @@ %Document -collate %Document -impose and friends (inc. 0-w, 0-h for long ones, how lines scale etc., undefined if pages different sizes) %Document -bookmarks-json including mentioning UTF8 +%Document -list-annotations-json and -add-annotations-json \documentclass{book} % Edit here to produce cpdfmanual.pdf, cpdflibmanual.pdf, pycpdfmanual.pdf etc.