Finished annotation and pattern changes for -twoup
This commit is contained in:
parent
a112c28e65
commit
8dfc2fc1f7
58
cpdf.ml
58
cpdf.ml
|
@ -3163,16 +3163,57 @@ let twoup_stack_transforms mediabox =
|
||||||
in let t1 = Pdftransform.matrix_of_transform [tr1; rotate] in
|
in let t1 = Pdftransform.matrix_of_transform [tr1; rotate] in
|
||||||
[t0; t1]
|
[t0; t1]
|
||||||
|
|
||||||
|
(* Union two rest dictionaries from the same PDF. *)
|
||||||
|
let combine_pdf_rests pdf a b =
|
||||||
|
let a_entries =
|
||||||
|
match a with
|
||||||
|
| Pdf.Dictionary entries -> entries
|
||||||
|
| _ -> []
|
||||||
|
in let b_entries =
|
||||||
|
match b with
|
||||||
|
| Pdf.Dictionary entries -> entries
|
||||||
|
| _ -> []
|
||||||
|
in
|
||||||
|
let keys_to_combine = ["/Annots"] in
|
||||||
|
let combine_entries key =
|
||||||
|
let a_entries =
|
||||||
|
match Pdf.lookup_direct pdf key a with
|
||||||
|
| Some (Pdf.Array d) -> d
|
||||||
|
| _ -> []
|
||||||
|
in let b_entries =
|
||||||
|
match Pdf.lookup_direct pdf key b with
|
||||||
|
| Some (Pdf.Array d) -> d
|
||||||
|
| _ -> []
|
||||||
|
in
|
||||||
|
if a_entries = [] && b_entries = [] then
|
||||||
|
None
|
||||||
|
else
|
||||||
|
Some (key, Pdf.Array (a_entries @ b_entries))
|
||||||
|
in
|
||||||
|
let unknown_keys_a = lose (fun (k, _) -> mem k keys_to_combine) a_entries in
|
||||||
|
let unknown_keys_b = lose (fun (k, _) -> mem k keys_to_combine) b_entries in
|
||||||
|
let combined_known_entries = option_map combine_entries keys_to_combine in
|
||||||
|
Pdf.Dictionary (unknown_keys_a @ unknown_keys_b @ combined_known_entries)
|
||||||
|
|
||||||
(* Combine two pages into one throughout the document. The pages have already
|
(* Combine two pages into one throughout the document. The pages have already
|
||||||
had their objects renumbered so as not to clash.*)
|
had their objects renumbered so as not to clash.*)
|
||||||
let twoup_pages_inner isstack fast pdf = function
|
let twoup_pages_inner isstack fast pdf = function
|
||||||
| [] -> assert false
|
| [] -> assert false
|
||||||
| (h::_) as pages ->
|
| (h::_) as pages ->
|
||||||
let resources' =
|
let transforms =
|
||||||
pair_reduce
|
take (((if isstack then twoup_stack_transforms else twoup_transforms) h.Pdfpage.mediabox)) (length pages)
|
||||||
(combine_pdf_resources pdf)
|
|
||||||
(map (fun p -> p.Pdfpage.resources) pages)
|
|
||||||
in
|
in
|
||||||
|
(* Change the pattern matrices before combining resources *)
|
||||||
|
let pages, h =
|
||||||
|
let r =
|
||||||
|
List.map2
|
||||||
|
(fun p t -> {p with Pdfpage.resources = change_pattern_matrices pdf t p.Pdfpage.resources})
|
||||||
|
pages transforms
|
||||||
|
in
|
||||||
|
r, List.hd r
|
||||||
|
in
|
||||||
|
let resources' = pair_reduce (combine_pdf_resources pdf) (map (fun p -> p.Pdfpage.resources) pages) in
|
||||||
|
let rest' = pair_reduce (combine_pdf_rests pdf) (map (fun p -> p.Pdfpage.rest) pages) in
|
||||||
let content' =
|
let content' =
|
||||||
let transform_stream clipbox contents transform =
|
let transform_stream clipbox contents transform =
|
||||||
let clipops =
|
let clipops =
|
||||||
|
@ -3194,14 +3235,15 @@ let twoup_pages_inner isstack fast pdf = function
|
||||||
in
|
in
|
||||||
List.flatten
|
List.flatten
|
||||||
(map2
|
(map2
|
||||||
(fun p ->
|
(fun p t ->
|
||||||
|
transform_annotations pdf t p.Pdfpage.rest;
|
||||||
transform_stream
|
transform_stream
|
||||||
(match Pdf.lookup_direct pdf "/CropBox" p.Pdfpage.rest with
|
(match Pdf.lookup_direct pdf "/CropBox" p.Pdfpage.rest with
|
||||||
None -> p.Pdfpage.mediabox
|
None -> p.Pdfpage.mediabox
|
||||||
| Some box -> box)
|
| Some box -> box)
|
||||||
p.Pdfpage.content)
|
p.Pdfpage.content t)
|
||||||
pages
|
pages
|
||||||
(take (((if isstack then twoup_stack_transforms else twoup_transforms) h.Pdfpage.mediabox)) (length pages)))
|
transforms)
|
||||||
in
|
in
|
||||||
{Pdfpage.mediabox =
|
{Pdfpage.mediabox =
|
||||||
if isstack then
|
if isstack then
|
||||||
|
@ -3215,7 +3257,7 @@ let twoup_pages_inner isstack fast pdf = function
|
||||||
Pdfpage.rotate = h.Pdfpage.rotate;
|
Pdfpage.rotate = h.Pdfpage.rotate;
|
||||||
Pdfpage.content = content';
|
Pdfpage.content = content';
|
||||||
Pdfpage.resources = resources';
|
Pdfpage.resources = resources';
|
||||||
Pdfpage.rest = if isstack then Pdf.remove_dict_entry h.Pdfpage.rest "/CropBox" else h.Pdfpage.rest}
|
Pdfpage.rest = if isstack then Pdf.remove_dict_entry rest' "/CropBox" else rest'}
|
||||||
|
|
||||||
let f_twoup f_pages pdf =
|
let f_twoup f_pages pdf =
|
||||||
let pagenums = ilist 1 (Pdfpage.endpage pdf) in
|
let pagenums = ilist 1 (Pdfpage.endpage pdf) in
|
||||||
|
|
Loading…
Reference in New Issue