From ac26417de81da7162e288c33e52934e62510f7ff Mon Sep 17 00:00:00 2001 From: John Whitington Date: Thu, 12 Nov 2020 15:16:58 +0000 Subject: [PATCH] Rearrange -show-boxes -trim-marks for cpdflib --- cpdf.ml | 75 ++++++++++++++++++++++++++++++++++++++++++++++ cpdf.mli | 4 +++ cpdfcommand.ml | 79 ++----------------------------------------------- cpdfmanual.pdf | Bin 239724 -> 239726 bytes cpdfmanual.tex | 2 +- 5 files changed, 82 insertions(+), 78 deletions(-) diff --git a/cpdf.ml b/cpdf.ml index 306afe0..b6e343d 100644 --- a/cpdf.ml +++ b/cpdf.ml @@ -4492,3 +4492,78 @@ let ocg_order_all pdf = end | _ -> () +(* Add rectangles on top of pages to show Media, Crop, Art, Trim, Bleed boxes. + * + * We use different dash lengths and colours to help distinguish coincident + * boxes The sequence of operators is postpended to the page content, + * appropriately protected to prevent pollution of matrices. + * + * /MediaBox: Solid red line + * /CropBox: Dashed 7 on 7 off green line + * /ArtBox: Dashed 5 on 5 off blue line + * /TrimBox: Dashed 3 on 3 off orange line + * /BleedBox: Dashed 2 on 2 off pink line *) +let get_rectangle pdf page box = + if box = "/MediaBox" then + match page.Pdfpage.mediabox with + Pdf.Array [a; b; c; d] as r -> Some (Pdf.parse_rectangle r) + | _ -> None + else + match Pdf.lookup_direct pdf box page.Pdfpage.rest with + Some (Pdf.Array [a; b; c; d] as r) -> Some (Pdf.parse_rectangle r) + | _ -> None + +let show_boxes_page fast pdf _ page = + let make_ops (r, g, b) on off boxname = + match get_rectangle pdf page boxname with + Some (r1, r2, r3, r4) -> + [Pdfops.Op_q; + Pdfops.Op_RG (r /. 255., g /. 255., b /. 255.); + Pdfops.Op_w 1.; + Pdfops.Op_d ((if on = 0. && off = 0. then [] else [on; off]), 0.); + Pdfops.Op_re (r1, r2, r3 -. r1, r4 -. r2); + Pdfops.Op_S; + Pdfops.Op_Q] + | None -> [] + in + let ops = + make_ops (255., 0., 0.) 0. 0. "/MediaBox" + @ make_ops (0., 255., 0.) 7. 7. "/CropBox" + @ make_ops (0., 0., 255.) 5. 5. "/ArtBox" + @ make_ops (255.,150.,0.) 3. 3. "/TrimBox" + @ make_ops (255.,9.,147.) 2. 2. "/BleedBox" + in + Pdfpage.postpend_operators pdf ops ~fast page + +let show_boxes ?(fast=false) pdf range = + process_pages (show_boxes_page fast pdf) pdf range + +let allowance = 9. + +let line (x0, y0, x1, y1) = + [Pdfops.Op_m (x0, y0); + Pdfops.Op_l (x1, y1); + Pdfops.Op_s] + +let trim_marks_page fast pdf n page = + match get_rectangle pdf page "/TrimBox", get_rectangle pdf page "/MediaBox" with + | Some (tminx, tminy, tmaxx, tmaxy), Some (minx, miny, maxx, maxy) -> + let ops = + [Pdfops.Op_q; + Pdfops.Op_K (1., 1., 1., 1.); + Pdfops.Op_w 1.] + @ line (minx, tmaxy, tminy -. allowance, tmaxy) (* top left *) + @ line (tminx, tmaxy +. allowance, tminx, maxy) + @ line (tmaxx +. allowance, tmaxy, maxx, tmaxy) (* top right *) + @ line (tmaxx, tmaxy +. allowance, tmaxx, maxy) + @ line (tmaxx +. allowance, tminy, maxx, tminy) (* bottom right *) + @ line (tmaxx, tminy -. allowance, tmaxx, miny) + @ line (tminx -. allowance, tminy, minx, tminy) (* bottom left *) + @ line (tminx, tminy -. allowance, tminx, miny) + @ [Pdfops.Op_Q] + in + Pdfpage.postpend_operators pdf ops ~fast page + | _, _ -> Printf.eprintf "warning: no /TrimBox found on page %i\n" n; page + +let trim_marks ?(fast=false) pdf range = + process_pages (trim_marks_page fast pdf) pdf range diff --git a/cpdf.mli b/cpdf.mli index d8f2a71..2a51631 100644 --- a/cpdf.mli +++ b/cpdf.mli @@ -354,6 +354,10 @@ val scale_to_fit_pdf : ?fast:bool -> position -> float -> (float * float) list - (** Scale the contents of a page by a given factor centred around a given point in a given range. *) val scale_contents : ?fast:bool -> position -> float -> Pdf.t -> int list -> Pdf.t +val trim_marks : ?fast:bool -> Pdf.t -> int list -> Pdf.t + +val show_boxes : ?fast:bool -> Pdf.t -> int list -> Pdf.t + (** {2 Padding} *) (** Put blank pages before the given page numbers *) diff --git a/cpdfcommand.ml b/cpdfcommand.ml index f3cb330..53fce7f 100644 --- a/cpdfcommand.ml +++ b/cpdfcommand.ml @@ -3504,81 +3504,6 @@ let remove_all_text range pdf = pagenums; Pdfpage.change_pages true !pdf (rev !pages') -(* Add rectangles on top of pages to show Media, Crop, Art, Trim, Bleed boxes. - * - * We use different dash lengths and colours to help distinguish coincident - * boxes The sequence of operators is postpended to the page content, - * appropriately protected to prevent pollution of matrices. - * - * /MediaBox: Solid red line - * /CropBox: Dashed 7 on 7 off green line - * /ArtBox: Dashed 5 on 5 off blue line - * /TrimBox: Dashed 3 on 3 off orange line - * /BleedBox: Dashed 2 on 2 off pink line *) -let get_rectangle pdf page box = - if box = "/MediaBox" then - match page.Pdfpage.mediabox with - Pdf.Array [a; b; c; d] as r -> Some (Pdf.parse_rectangle r) - | _ -> None - else - match Pdf.lookup_direct pdf box page.Pdfpage.rest with - Some (Pdf.Array [a; b; c; d] as r) -> Some (Pdf.parse_rectangle r) - | _ -> None - -let show_boxes_page pdf _ page = - let make_ops (r, g, b) on off boxname = - match get_rectangle pdf page boxname with - Some (r1, r2, r3, r4) -> - [Pdfops.Op_q; - Pdfops.Op_RG (r /. 255., g /. 255., b /. 255.); - Pdfops.Op_w 1.; - Pdfops.Op_d ((if on = 0. && off = 0. then [] else [on; off]), 0.); - Pdfops.Op_re (r1, r2, r3 -. r1, r4 -. r2); - Pdfops.Op_S; - Pdfops.Op_Q] - | None -> [] - in - let ops = - make_ops (255., 0., 0.) 0. 0. "/MediaBox" - @ make_ops (0., 255., 0.) 7. 7. "/CropBox" - @ make_ops (0., 0., 255.) 5. 5. "/ArtBox" - @ make_ops (255.,150.,0.) 3. 3. "/TrimBox" - @ make_ops (255.,9.,147.) 2. 2. "/BleedBox" - in - Pdfpage.postpend_operators pdf ops ~fast:args.fast page - -let show_boxes range pdf = - Cpdf.process_pages (show_boxes_page pdf) pdf range - -let allowance = 9. - -let line (x0, y0, x1, y1) = - [Pdfops.Op_m (x0, y0); - Pdfops.Op_l (x1, y1); - Pdfops.Op_s] - -let trim_marks_page pdf n page = - match get_rectangle pdf page "/TrimBox", get_rectangle pdf page "/MediaBox" with - | Some (tminx, tminy, tmaxx, tmaxy), Some (minx, miny, maxx, maxy) -> - let ops = - [Pdfops.Op_q; - Pdfops.Op_K (1., 1., 1., 1.); - Pdfops.Op_w 1.] - @ line (minx, tmaxy, tminy -. allowance, tmaxy) (* top left *) - @ line (tminx, tmaxy +. allowance, tminx, maxy) - @ line (tmaxx +. allowance, tmaxy, maxx, tmaxy) (* top right *) - @ line (tmaxx, tmaxy +. allowance, tmaxx, maxy) - @ line (tmaxx +. allowance, tminy, maxx, tminy) (* bottom right *) - @ line (tmaxx, tminy -. allowance, tmaxx, miny) - @ line (tminx -. allowance, tminy, minx, tminy) (* bottom left *) - @ line (tminx, tminy -. allowance, tminx, miny) - @ [Pdfops.Op_Q] - in - Pdfpage.postpend_operators pdf ops ~fast:args.fast page - | _, _ -> Printf.eprintf "warning: no /TrimBox found on page %i\n" n; page - -let trim_marks range pdf = - Cpdf.process_pages (trim_marks_page pdf) pdf range let write_json output pdf = match output with @@ -4458,11 +4383,11 @@ let go () = | Some ShowBoxes -> let pdf = get_single_pdf args.op false in let range = parse_pagespec pdf (get_pagespec ()) in - write_pdf false (show_boxes range pdf) + write_pdf false (Cpdf.show_boxes pdf range) | Some TrimMarks -> let pdf = get_single_pdf args.op false in let range = parse_pagespec pdf (get_pagespec ()) in - write_pdf false (trim_marks range pdf) + write_pdf false (Cpdf.trim_marks pdf range) | Some (Postpend s | Prepend s as x) -> let pdf = get_single_pdf args.op false in let range = parse_pagespec pdf (get_pagespec ()) in diff --git a/cpdfmanual.pdf b/cpdfmanual.pdf index 67e74c017d60e9d917d6b158d1685a4934fc13dc..29e0092a031ebad74f7458193ff54b0f5a708ea1 100644 GIT binary patch delta 4723 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 delta 4740 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 Q1`ANgQHhA?8sDM%4<8rpzW@LL diff --git a/cpdfmanual.tex b/cpdfmanual.tex index bfc6873..15173ee 100644 --- a/cpdfmanual.tex +++ b/cpdfmanual.tex @@ -657,7 +657,7 @@ the result is unspecified. The following format operators may be used: \end{tabular} \end{table} -Numbers padded to a fixed width field by zeroes may be obtained for \texttt{@S} and \texttt{@E} by following them with more \texttt{@} signs e.g \texttt{@E@@@} for a fixed width of three. +\noindent Numbers padded to a fixed width field by zeroes may be obtained for \texttt{@S} and \texttt{@E} by following them with more \texttt{@} signs e.g \texttt{@E@@@} for a fixed width of three. \section{Splitting on Bookmarks} \index{splitting!on bookmarks}