more
This commit is contained in:
parent
f406397cc8
commit
c2e89565a2
|
@ -146,7 +146,7 @@ let impose_pages fit x y columns rtl btt center margin output_mediabox fast fit_
|
|||
in
|
||||
flatten
|
||||
(map2
|
||||
(fun p t -> Cpdfutil.transform_annotations pdf t p.Pdfpage.rest; transform_stream t p.Pdfpage.content)
|
||||
(fun p t -> Pdfannot.transform_annotations pdf t p.Pdfpage.rest; transform_stream t p.Pdfpage.content)
|
||||
pages
|
||||
transforms)
|
||||
in
|
||||
|
|
18
cpdfpage.ml
18
cpdfpage.ml
|
@ -91,7 +91,7 @@ let shift_page ?(fast=false) dxdylist pdf pnum page =
|
|||
(*let page =
|
||||
Cpdfutil.change_pattern_matrices_page pdf (Pdftransform.mktranslate ~-.dx ~-.dy) page
|
||||
in*)
|
||||
Cpdfutil.transform_annotations pdf (Pdftransform.mktranslate dx dy) page.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf (Pdftransform.mktranslate dx dy) page.Pdfpage.rest;
|
||||
(Pdfpage.prepend_operators pdf [transform_op] ~fast page, pnum, Pdftransform.mktranslate dx dy)
|
||||
|
||||
let shift_pdf ?(fast=false) dxdylist pdf range =
|
||||
|
@ -163,7 +163,7 @@ let scale_page_contents ?(fast=false) scale position pdf pnum page =
|
|||
in
|
||||
let transform_op = Pdfops.Op_cm transform in
|
||||
(*let page = Cpdfutil.change_pattern_matrices_page pdf transform page in*)
|
||||
Cpdfutil.transform_annotations pdf transform page.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf transform page.Pdfpage.rest;
|
||||
(Pdfpage.prepend_operators pdf [transform_op] ~fast page, pnum, transform)
|
||||
|
||||
let scale_contents ?(fast=false) position scale pdf range =
|
||||
|
@ -260,7 +260,7 @@ let transform_boxes tr pdf page =
|
|||
let transform_contents ?(fast=false) tr pdf page =
|
||||
let transform_op = Pdfops.Op_cm tr in
|
||||
(*let page = Cpdfutil.change_pattern_matrices_page pdf (Pdftransform.matrix_invert tr) page in*)
|
||||
Cpdfutil.transform_annotations pdf tr page.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf tr page.Pdfpage.rest;
|
||||
Pdfpage.prepend_operators pdf [transform_op] ~fast page
|
||||
|
||||
(* Change a page's media box so its minimum x and y are 0, making other
|
||||
|
@ -321,7 +321,7 @@ let rotate_page_contents ~fast rotpoint r pdf pnum page =
|
|||
in
|
||||
let transform_op = Pdfops.Op_cm tr in
|
||||
(*let page = Cpdfutil.change_pattern_matrices_page pdf tr2 page in*)
|
||||
Cpdfutil.transform_annotations pdf tr page.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf tr page.Pdfpage.rest;
|
||||
(Pdfpage.prepend_operators pdf [transform_op] ~fast page, pnum, tr)
|
||||
|
||||
let rotate_contents ?(fast=false) r pdf range =
|
||||
|
@ -341,7 +341,7 @@ let scale_pdf ?(fast=false) sxsylist pdf range =
|
|||
(*and page =
|
||||
Cpdfutil.change_pattern_matrices_page pdf (Pdftransform.matrix_invert matrix) page*)
|
||||
in
|
||||
Cpdfutil.transform_annotations pdf matrix page.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf matrix page.Pdfpage.rest;
|
||||
(Pdfpage.prepend_operators pdf ~fast [transform_op] page, pnum, matrix)
|
||||
in
|
||||
process_pages scale_page pdf range
|
||||
|
@ -382,7 +382,7 @@ let scale_to_fit_pdf ?(fast=false) position input_scale xylist op pdf range =
|
|||
(function (minx, miny, maxx, maxy) -> 0., 0., x, y)
|
||||
pdf page
|
||||
in
|
||||
Cpdfutil.transform_annotations pdf matrix page.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf matrix page.Pdfpage.rest;
|
||||
(Pdfpage.prepend_operators pdf [Pdfops.Op_cm matrix] ~fast
|
||||
((*Cpdfutil.change_pattern_matrices_page pdf (Pdftransform.matrix_invert matrix)*) page), pnum, matrix)
|
||||
in
|
||||
|
@ -423,7 +423,7 @@ let flip_page ?(fast=false) transform_op pdf pnum page =
|
|||
in
|
||||
let tr = transform_op minx miny maxx maxy in
|
||||
(*let page = Cpdfutil.change_pattern_matrices_page pdf tr page in*)
|
||||
Cpdfutil.transform_annotations pdf tr page.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf tr page.Pdfpage.rest;
|
||||
(Pdfpage.prepend_operators pdf [Pdfops.Op_cm tr] ~fast page, pnum, tr)
|
||||
|
||||
let vflip_pdf ?(fast=false) pdf range =
|
||||
|
@ -513,7 +513,7 @@ let do_stamp relative_to_cropbox fast position topline midline scale_to_fit isov
|
|||
(if relative_to_cropbox then [Pdftransform.Translate (txmin, tymin)] else []) @
|
||||
[Pdftransform.Scale ((sxmin, symin), scale, scale)]))
|
||||
in
|
||||
Cpdfutil.transform_annotations pdf matrix o.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf matrix o.Pdfpage.rest;
|
||||
let r = Pdfpage.prepend_operators pdf [Pdfops.Op_cm matrix] ~fast o in
|
||||
(*Cpdfutil.change_pattern_matrices_page pdf matrix*) r
|
||||
else
|
||||
|
@ -525,7 +525,7 @@ let do_stamp relative_to_cropbox fast position topline midline scale_to_fit isov
|
|||
((if relative_to_cropbox then [Pdftransform.Translate (txmin, tymin)] else []) @
|
||||
[Pdftransform.Translate (dx, dy)]))
|
||||
in
|
||||
Cpdfutil.transform_annotations pdf matrix o.Pdfpage.rest;
|
||||
Pdfannot.transform_annotations pdf matrix o.Pdfpage.rest;
|
||||
let r = Pdfpage.prepend_operators pdf [Pdfops.Op_cm matrix] ~fast o in
|
||||
(*Cpdfutil.change_pattern_matrices_page pdf matrix*) r
|
||||
in
|
||||
|
|
78
cpdfutil.ml
78
cpdfutil.ml
|
@ -134,81 +134,3 @@ let combine_pdf_resources pdf a b =
|
|||
(fun dict (k, v) -> Pdf.add_dict_entry dict k v)
|
||||
(Pdf.Dictionary [])
|
||||
(unknown_keys_a @ unknown_keys_b @ combined_known_entries)
|
||||
|
||||
let transform_rect pdf transform rect =
|
||||
let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf rect in
|
||||
let (x0, y0) = Pdftransform.transform_matrix transform (minx, miny) in
|
||||
let (x1, y1) = Pdftransform.transform_matrix transform (maxx, maxy) in
|
||||
let (x2, y2) = Pdftransform.transform_matrix transform (minx, maxy) in
|
||||
let (x3, y3) = Pdftransform.transform_matrix transform (maxx, miny) in
|
||||
let minx = fmin (fmin x0 x1) (fmin x2 x3) in
|
||||
let miny = fmin (fmin y0 y1) (fmin y2 y3) in
|
||||
let maxx = fmax (fmax x0 x1) (fmax x2 x3) in
|
||||
let maxy = fmax (fmax y0 y1) (fmax y2 y3) in
|
||||
Pdf.Array [Pdf.Real minx; Pdf.Real miny; Pdf.Real maxx; Pdf.Real maxy]
|
||||
|
||||
let transform_quadpoint_single pdf transform = function
|
||||
| [x1; y1; x2; y2; x3; y3; x4; y4] ->
|
||||
let x1, y1, x2, y2, x3, y3, x4, y4 =
|
||||
Pdf.getnum pdf x1, Pdf.getnum pdf y1,
|
||||
Pdf.getnum pdf x2, Pdf.getnum pdf y2,
|
||||
Pdf.getnum pdf x3, Pdf.getnum pdf y3,
|
||||
Pdf.getnum pdf x4, Pdf.getnum pdf y4
|
||||
in
|
||||
let (x1, y1) = Pdftransform.transform_matrix transform (x1, y1) in
|
||||
let (x2, y2) = Pdftransform.transform_matrix transform (x2, y2) in
|
||||
let (x3, y3) = Pdftransform.transform_matrix transform (x3, y3) in
|
||||
let (x4, y4) = Pdftransform.transform_matrix transform (x4, y4) in
|
||||
map (fun x -> Pdf.Real x) [x1; y1; x2; y2; x3; y3; x4; y4]
|
||||
| qp ->
|
||||
Printf.eprintf "Malformed /QuadPoints format: must be a multiple of 8 entries\n";
|
||||
qp
|
||||
|
||||
let transform_quadpoints pdf transform = function
|
||||
| Pdf.Array qps ->
|
||||
Pdf.Array (flatten (map (transform_quadpoint_single pdf transform) (splitinto 8 qps)))
|
||||
| qp ->
|
||||
Printf.eprintf "Unknown or malformed /QuadPoints format %s\n" (Pdfwrite.string_of_pdf qp);
|
||||
qp
|
||||
|
||||
(* Apply transformations to any annotations in /Annots (i.e their /Rect and
|
||||
/QuadPoints entries). Also as a best-effort service, altering other
|
||||
coordinates, like the endpoints /L in a line annotation. *)
|
||||
let transform_annotations pdf transform rest =
|
||||
match Pdf.lookup_direct pdf "/Annots" rest with
|
||||
| Some (Pdf.Array annots) ->
|
||||
(* Always indirect references, so alter in place *)
|
||||
iter
|
||||
(function
|
||||
| Pdf.Indirect i ->
|
||||
let annot = Pdf.lookup_obj pdf i in
|
||||
let rect' =
|
||||
match Pdf.lookup_direct pdf "/Rect" annot with
|
||||
| Some rect -> transform_rect pdf transform rect
|
||||
| None -> raise (Pdf.PDFError "transform_annotations: no rect")
|
||||
in
|
||||
let quadpoints' =
|
||||
match Pdf.lookup_direct pdf "/QuadPoints" annot with
|
||||
| Some qp -> Some (transform_quadpoints pdf transform qp)
|
||||
| None -> None
|
||||
in
|
||||
let line' =
|
||||
match Pdf.lookup_direct pdf "/L" annot with
|
||||
| Some rect -> Some (transform_rect pdf transform rect)
|
||||
| _ -> None
|
||||
in
|
||||
let annot = Pdf.add_dict_entry annot "/Rect" rect' in
|
||||
let annot =
|
||||
match quadpoints' with
|
||||
| Some qp -> Pdf.add_dict_entry annot "/QuadPoints" qp
|
||||
| None -> annot
|
||||
in
|
||||
let annot =
|
||||
match line' with
|
||||
| Some l -> Pdf.add_dict_entry annot "/L" l
|
||||
| None -> annot
|
||||
in
|
||||
Pdf.addobj_given_num pdf (i, annot)
|
||||
| _ -> Printf.eprintf "transform_annotations: not indirect\n%!")
|
||||
annots
|
||||
| _ -> ()
|
||||
|
|
|
@ -8,6 +8,4 @@ val process_xobjects : Pdf.t ->
|
|||
|
||||
val combine_pdf_resources : Pdf.t -> Pdf.pdfobject -> Pdf.pdfobject -> Pdf.pdfobject
|
||||
|
||||
val transform_annotations : Pdf.t -> Pdftransform.transform_matrix -> Pdf.pdfobject -> unit
|
||||
|
||||
val ppstub : ('a -> 'b -> 'c) -> 'a -> 'b -> 'c * 'a * Pdftransform.transform_matrix
|
||||
|
|
Loading…
Reference in New Issue