Chop changes

This commit is contained in:
John Whitington 2023-11-28 16:14:07 +00:00
parent 70961eb692
commit 782358feb5
1 changed files with 19 additions and 8 deletions

View File

@ -1,14 +1,14 @@
open Pdfutil open Pdfutil
open Cpdferror open Cpdferror
(* FIXME Resources - what to do with each. Bookmarks? Annotations - must be duplicated... *) (* 1. FIXME btt / rtl / columns *)
(* FIXME How to link annotations within the document work? *) (* 2. FIXME Test/document how the sharing affects other cpdf operations - especially with -fast! What do we do with fast/slow, and what does it affect, and does -fast need documentation about what happens in general with shared content streams. *)
(* FIXME Are 'changes' for change_pages important? *) (* 3. Annotations must be duplicated *)
(* FIXME Test how the sharing affects other cpdf operations - especially with -fast! *) (* 4. What is the effect on bookmarks and links annotations? *)
(* 5. Any other page meta items? *)
(* Chop a single page into pieces. We prefer the cropbox when available. We set (* Chop a single page into pieces. We prefer the cropbox when available. We set
mediabox only, and delete any other boxes. *) mediabox only, and delete any other boxes. *)
(* FIXME btt / rtl / columns *)
let get_box pdf page = let get_box pdf page =
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
| Some r -> Pdf.parse_rectangle pdf r | Some r -> Pdf.parse_rectangle pdf r
@ -42,12 +42,23 @@ let chop_boxes pdf x y columns btt rtl p =
(* Chop pages in the range into pieces *) (* Chop pages in the range into pieces *)
let chop ~x ~y ~columns ~btt ~rtl pdf range = let chop ~x ~y ~columns ~btt ~rtl pdf range =
let pages = Pdfpage.pages_of_pagetree pdf in let pages = Pdfpage.pages_of_pagetree pdf in
let pages = let pages_out =
flatten flatten
(map2 (map2
(fun n p -> if mem n range then chop_boxes pdf x y columns btt rtl p else [p]) (fun n p -> if mem n range then chop_boxes pdf x y columns btt rtl p else [p])
(ilist 1 (Pdfpage.endpage pdf)) (ilist 1 (Pdfpage.endpage pdf))
pages) pages)
in in
let changes = [] in let changes =
Pdfpage.change_pages ~changes true pdf pages let q = ref 0 in
flatten
(map2
(fun n p ->
if mem n range
then (q += 1; let r = combine (many n (x * y)) (ilist !q (!q + x * y - 1)) in q += (x * y - 1); r)
else (q += 1; [(n, !q)]))
(ilist 1 (Pdfpage.endpage pdf))
pages)
in
(*iter (fun (a, b) -> Printf.printf "%i -> %i\n" a b) changes;*)
Pdfpage.change_pages ~changes true pdf pages_out