Fix to work with CamlPDF new getnum
This commit is contained in:
parent
c99d617bb6
commit
755a4352b5
|
@ -373,10 +373,10 @@ let addtext
|
||||||
let mediabox =
|
let mediabox =
|
||||||
if cropbox then
|
if cropbox then
|
||||||
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
||||||
| Some pdfobject -> Pdf.parse_rectangle (Pdf.direct pdf pdfobject)
|
| Some pdfobject -> Pdf.parse_rectangle pdf (Pdf.direct pdf pdfobject)
|
||||||
| None -> Pdf.parse_rectangle page.Pdfpage.mediabox
|
| None -> Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
else
|
else
|
||||||
Pdf.parse_rectangle page.Pdfpage.mediabox
|
Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
in
|
in
|
||||||
let x, y, rotate = Cpdfposition.calculate_position false textwidth mediabox orientation position in
|
let x, y, rotate = Cpdfposition.calculate_position false textwidth mediabox orientation position in
|
||||||
let hoffset, voffset =
|
let hoffset, voffset =
|
||||||
|
@ -601,10 +601,10 @@ let addrectangle
|
||||||
let mediabox =
|
let mediabox =
|
||||||
if relative_to_cropbox then
|
if relative_to_cropbox then
|
||||||
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
||||||
| Some pdfobject -> Pdf.parse_rectangle (Pdf.direct pdf pdfobject)
|
| Some pdfobject -> Pdf.parse_rectangle pdf (Pdf.direct pdf pdfobject)
|
||||||
| None -> Pdf.parse_rectangle page.Pdfpage.mediabox
|
| None -> Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
else
|
else
|
||||||
Pdf.parse_rectangle page.Pdfpage.mediabox
|
Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
in
|
in
|
||||||
let x, y, _ =
|
let x, y, _ =
|
||||||
Cpdfposition.calculate_position false w mediabox Cpdfposition.Horizontal position
|
Cpdfposition.calculate_position false w mediabox Cpdfposition.Horizontal position
|
||||||
|
|
|
@ -96,7 +96,7 @@ let attach_file ?memory keepversion topage pdf file =
|
||||||
| _ -> []
|
| _ -> []
|
||||||
in
|
in
|
||||||
let rect =
|
let rect =
|
||||||
let minx, miny, maxx, maxy = Pdf.parse_rectangle page.Pdfpage.mediabox in
|
let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf page.Pdfpage.mediabox in
|
||||||
Pdf.Array [Pdf.Real 18.; Pdf.Real (maxy -. 45.); Pdf.Real 45.; Pdf.Real (maxy -. 18.)]
|
Pdf.Array [Pdf.Real 18.; Pdf.Real (maxy -. 45.); Pdf.Real 45.; Pdf.Real (maxy -. 18.)]
|
||||||
in
|
in
|
||||||
let filespecobj = Pdf.addobj pdf filespec in
|
let filespecobj = Pdf.addobj pdf filespec in
|
||||||
|
|
|
@ -3,7 +3,7 @@ let demo = false
|
||||||
let noncomp = false
|
let noncomp = false
|
||||||
let major_version = 2
|
let major_version = 2
|
||||||
let minor_version = 6
|
let minor_version = 6
|
||||||
let version_date = "(devel, 3 April 2022)"
|
let version_date = "(devel, 14 Jul 2022)"
|
||||||
|
|
||||||
open Pdfutil
|
open Pdfutil
|
||||||
open Pdfio
|
open Pdfio
|
||||||
|
|
36
cpdfcoord.ml
36
cpdfcoord.ml
|
@ -26,25 +26,25 @@ let cropbox pdf page =
|
||||||
| Some pdfobject -> Pdf.direct pdf pdfobject
|
| Some pdfobject -> Pdf.direct pdf pdfobject
|
||||||
| None -> page.Pdfpage.mediabox
|
| None -> page.Pdfpage.mediabox
|
||||||
|
|
||||||
let width box = let minx, miny, maxx, maxy = Pdf.parse_rectangle box in maxx -. minx
|
let width pdf box = let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf box in maxx -. minx
|
||||||
let height box = let minx, miny, maxx, maxy = Pdf.parse_rectangle box in maxy -. miny
|
let height pdf box = let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf box in maxy -. miny
|
||||||
let minx box = let minx, miny, maxx, maxy = Pdf.parse_rectangle box in minx
|
let minx pdf box = let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf box in minx
|
||||||
let miny box = let minx, miny, maxx, maxy = Pdf.parse_rectangle box in miny
|
let miny pdf box = let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf box in miny
|
||||||
let maxx box = let minx, miny, maxx, maxy = Pdf.parse_rectangle box in maxx
|
let maxx pdf box = let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf box in maxx
|
||||||
let maxy box = let minx, miny, maxx, maxy = Pdf.parse_rectangle box in maxy
|
let maxy pdf box = let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf box in maxy
|
||||||
|
|
||||||
let find_page_width pdf page = width page.Pdfpage.mediabox
|
let find_page_width pdf page = width pdf page.Pdfpage.mediabox
|
||||||
let find_page_height pdf page = height page.Pdfpage.mediabox
|
let find_page_height pdf page = height pdf page.Pdfpage.mediabox
|
||||||
let find_page_crop_width pdf page = width (cropbox pdf page)
|
let find_page_crop_width pdf page = width pdf (cropbox pdf page)
|
||||||
let find_page_crop_height pdf page = height (cropbox pdf page)
|
let find_page_crop_height pdf page = height pdf (cropbox pdf page)
|
||||||
let find_page_minx pdf page = minx page.Pdfpage.mediabox
|
let find_page_minx pdf page = minx pdf page.Pdfpage.mediabox
|
||||||
let find_page_miny pdf page = miny page.Pdfpage.mediabox
|
let find_page_miny pdf page = miny pdf page.Pdfpage.mediabox
|
||||||
let find_page_maxx pdf page = maxx page.Pdfpage.mediabox
|
let find_page_maxx pdf page = maxx pdf page.Pdfpage.mediabox
|
||||||
let find_page_maxy pdf page = maxy page.Pdfpage.mediabox
|
let find_page_maxy pdf page = maxy pdf page.Pdfpage.mediabox
|
||||||
let find_page_crop_minx pdf page = minx (cropbox pdf page)
|
let find_page_crop_minx pdf page = minx pdf (cropbox pdf page)
|
||||||
let find_page_crop_miny pdf page = miny (cropbox pdf page)
|
let find_page_crop_miny pdf page = miny pdf (cropbox pdf page)
|
||||||
let find_page_crop_maxx pdf page = maxx (cropbox pdf page)
|
let find_page_crop_maxx pdf page = maxx pdf (cropbox pdf page)
|
||||||
let find_page_crop_maxy pdf page = maxy (cropbox pdf page)
|
let find_page_crop_maxy pdf page = maxy pdf (cropbox pdf page)
|
||||||
|
|
||||||
let find_page_characteristic pdf page = function
|
let find_page_characteristic pdf page = function
|
||||||
| "PW" -> find_page_width pdf page
|
| "PW" -> find_page_width pdf page
|
||||||
|
|
|
@ -225,11 +225,11 @@ and image_resolution pdf range dpi =
|
||||||
| Some (Pdf.Name "/Image") ->
|
| Some (Pdf.Name "/Image") ->
|
||||||
let width =
|
let width =
|
||||||
match Pdf.lookup_direct pdf "/Width" xobject with
|
match Pdf.lookup_direct pdf "/Width" xobject with
|
||||||
| Some x -> Pdf.getnum x
|
| Some x -> Pdf.getnum pdf x
|
||||||
| None -> 1.
|
| None -> 1.
|
||||||
and height =
|
and height =
|
||||||
match Pdf.lookup_direct pdf "/Height" xobject with
|
match Pdf.lookup_direct pdf "/Height" xobject with
|
||||||
| Some x -> Pdf.getnum x
|
| Some x -> Pdf.getnum pdf x
|
||||||
| None -> 1.
|
| None -> 1.
|
||||||
in
|
in
|
||||||
images := (pagenum, name, Image (int_of_float width, int_of_float height))::!images
|
images := (pagenum, name, Image (int_of_float width, int_of_float height))::!images
|
||||||
|
@ -243,8 +243,8 @@ and image_resolution pdf range dpi =
|
||||||
and matrix =
|
and matrix =
|
||||||
match Pdf.lookup_direct pdf "/Matrix" xobject with
|
match Pdf.lookup_direct pdf "/Matrix" xobject with
|
||||||
| Some (Pdf.Array [a; b; c; d; e; f]) ->
|
| Some (Pdf.Array [a; b; c; d; e; f]) ->
|
||||||
{Pdftransform.a = Pdf.getnum a; Pdftransform.b = Pdf.getnum b; Pdftransform.c = Pdf.getnum c;
|
{Pdftransform.a = Pdf.getnum pdf a; Pdftransform.b = Pdf.getnum pdf b; Pdftransform.c = Pdf.getnum pdf c;
|
||||||
Pdftransform.d = Pdf.getnum d; Pdftransform.e = Pdf.getnum e; Pdftransform.f = Pdf.getnum f}
|
Pdftransform.d = Pdf.getnum pdf d; Pdftransform.e = Pdf.getnum pdf e; Pdftransform.f = Pdf.getnum pdf f}
|
||||||
| _ -> Pdftransform.i_matrix
|
| _ -> Pdftransform.i_matrix
|
||||||
in
|
in
|
||||||
images := (pagenum, name, Form (matrix, contents, resources))::!images
|
images := (pagenum, name, Form (matrix, contents, resources))::!images
|
||||||
|
|
|
@ -41,10 +41,10 @@ let combine_pdf_rests pdf a b =
|
||||||
(* Calculate the transformation matrices for a single imposed output page. *)
|
(* Calculate the transformation matrices for a single imposed output page. *)
|
||||||
|
|
||||||
(* make margins by scaling for a fitted impose. *)
|
(* make margins by scaling for a fitted impose. *)
|
||||||
let make_margin output_mediabox margin tr =
|
let make_margin pdf output_mediabox margin tr =
|
||||||
if margin = 0. then tr else
|
if margin = 0. then tr else
|
||||||
let width, height =
|
let width, height =
|
||||||
match Pdf.parse_rectangle output_mediabox with
|
match Pdf.parse_rectangle pdf output_mediabox with
|
||||||
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin
|
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin
|
||||||
in
|
in
|
||||||
if margin > width /. 2. || margin > height /. 2. then error "margin would fill whole page!" else
|
if margin > width /. 2. || margin > height /. 2. then error "margin would fill whole page!" else
|
||||||
|
@ -59,9 +59,9 @@ let make_margin output_mediabox margin tr =
|
||||||
(Pdftransform.matrix_compose shift (Pdftransform.matrix_compose scale tr))
|
(Pdftransform.matrix_compose shift (Pdftransform.matrix_compose scale tr))
|
||||||
|
|
||||||
(* FIXME fixup -center for next release. For now it has been disabled. *)
|
(* FIXME fixup -center for next release. For now it has been disabled. *)
|
||||||
let impose_transforms fit fx fy columns rtl btt center margin mediabox output_mediabox fit_extra_hspace fit_extra_vspace len =
|
let impose_transforms pdf fit fx fy columns rtl btt center margin mediabox output_mediabox fit_extra_hspace fit_extra_vspace len =
|
||||||
let width, height =
|
let width, height =
|
||||||
match Pdf.parse_rectangle mediabox with
|
match Pdf.parse_rectangle pdf mediabox with
|
||||||
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin
|
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin
|
||||||
in
|
in
|
||||||
let trs = ref [] in
|
let trs = ref [] in
|
||||||
|
@ -116,14 +116,14 @@ let impose_transforms fit fx fy columns rtl btt center margin mediabox output_me
|
||||||
len := !len - 1
|
len := !len - 1
|
||||||
done
|
done
|
||||||
done;
|
done;
|
||||||
map (if fit then make_margin output_mediabox margin else Fun.id) (rev !trs)
|
map (if fit then make_margin pdf output_mediabox margin else Fun.id) (rev !trs)
|
||||||
|
|
||||||
let impose_pages fit x y columns rtl btt center margin output_mediabox fast fit_extra_hspace fit_extra_vspace pdf = function
|
let impose_pages fit x y columns rtl btt center margin output_mediabox fast fit_extra_hspace fit_extra_vspace pdf = function
|
||||||
| [] -> assert false
|
| [] -> assert false
|
||||||
| (h::_) as pages ->
|
| (h::_) as pages ->
|
||||||
let transforms =
|
let transforms =
|
||||||
impose_transforms
|
impose_transforms
|
||||||
fit x y columns rtl btt center margin h.Pdfpage.mediabox
|
pdf fit x y columns rtl btt center margin h.Pdfpage.mediabox
|
||||||
output_mediabox fit_extra_hspace fit_extra_vspace (length pages)
|
output_mediabox fit_extra_hspace fit_extra_vspace (length pages)
|
||||||
in
|
in
|
||||||
(* Change the pattern matrices before combining resources *)
|
(* Change the pattern matrices before combining resources *)
|
||||||
|
@ -165,7 +165,7 @@ let make_space fit ~fast spacing pdf =
|
||||||
let margin = spacing /. 2. in
|
let margin = spacing /. 2. in
|
||||||
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
||||||
let width, height =
|
let width, height =
|
||||||
match Pdf.parse_rectangle firstpage.Pdfpage.mediabox with
|
match Pdf.parse_rectangle pdf firstpage.Pdfpage.mediabox with
|
||||||
xmin, ymin, xmax, ymax -> (xmax -. xmin, ymax -. ymin)
|
xmin, ymin, xmax, ymax -> (xmax -. xmin, ymax -. ymin)
|
||||||
in
|
in
|
||||||
if fit then
|
if fit then
|
||||||
|
@ -185,7 +185,7 @@ let make_space fit ~fast spacing pdf =
|
||||||
let add_border linewidth ~fast pdf =
|
let add_border linewidth ~fast pdf =
|
||||||
if linewidth = 0. then pdf else
|
if linewidth = 0. then pdf else
|
||||||
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
||||||
let _, _, w, h = Pdf.parse_rectangle firstpage.Pdfpage.mediabox in
|
let _, _, w, h = Pdf.parse_rectangle pdf firstpage.Pdfpage.mediabox in
|
||||||
Cpdfaddtext.addrectangle
|
Cpdfaddtext.addrectangle
|
||||||
fast (w -. linewidth, h -. linewidth) (RGB (0., 0., 0.)) true linewidth 1. (Cpdfposition.BottomLeft (linewidth /. 2.))
|
fast (w -. linewidth, h -. linewidth) (RGB (0., 0., 0.)) true linewidth 1. (Cpdfposition.BottomLeft (linewidth /. 2.))
|
||||||
false false (ilist 1 (Pdfpage.endpage pdf)) pdf
|
false false (ilist 1 (Pdfpage.endpage pdf)) pdf
|
||||||
|
@ -199,7 +199,7 @@ let impose ~x ~y ~fit ~columns ~rtl ~btt ~center ~margin ~spacing ~linewidth ~fa
|
||||||
let pdf = add_border linewidth ~fast pdf in
|
let pdf = add_border linewidth ~fast pdf in
|
||||||
let pdf = make_space fit ~fast spacing pdf in
|
let pdf = make_space fit ~fast spacing pdf in
|
||||||
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
||||||
let _, _, w, h = Pdf.parse_rectangle firstpage.Pdfpage.mediabox in
|
let _, _, w, h = Pdf.parse_rectangle pdf firstpage.Pdfpage.mediabox in
|
||||||
let ix = int_of_float x in
|
let ix = int_of_float x in
|
||||||
let iy = int_of_float y in
|
let iy = int_of_float y in
|
||||||
let n, ix, iy, fit_extra_hspace, fit_extra_vspace =
|
let n, ix, iy, fit_extra_hspace, fit_extra_vspace =
|
||||||
|
@ -256,7 +256,7 @@ let twoup_stack fast pdf =
|
||||||
let twoup fast pdf =
|
let twoup fast pdf =
|
||||||
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
||||||
let width, height =
|
let width, height =
|
||||||
match Pdf.parse_rectangle firstpage.Pdfpage.mediabox with
|
match Pdf.parse_rectangle pdf firstpage.Pdfpage.mediabox with
|
||||||
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin
|
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin
|
||||||
in
|
in
|
||||||
let width_exceeds_height = width > height in
|
let width_exceeds_height = width > height in
|
||||||
|
|
36
cpdfpage.ml
36
cpdfpage.ml
|
@ -10,13 +10,13 @@ let output_page_info pdf range =
|
||||||
match page.Pdfpage.mediabox with
|
match page.Pdfpage.mediabox with
|
||||||
| Pdf.Array [a; b; c; d] ->
|
| Pdf.Array [a; b; c; d] ->
|
||||||
Printf.sprintf "%f %f %f %f"
|
Printf.sprintf "%f %f %f %f"
|
||||||
(Pdf.getnum a) (Pdf.getnum b) (Pdf.getnum c) (Pdf.getnum d)
|
(Pdf.getnum pdf a) (Pdf.getnum pdf b) (Pdf.getnum pdf c) (Pdf.getnum pdf d)
|
||||||
| _ -> ""
|
| _ -> ""
|
||||||
else
|
else
|
||||||
match Pdf.lookup_direct pdf box page.Pdfpage.rest with
|
match Pdf.lookup_direct pdf box page.Pdfpage.rest with
|
||||||
| Some (Pdf.Array [a; b; c; d]) ->
|
| Some (Pdf.Array [a; b; c; d]) ->
|
||||||
Printf.sprintf "%f %f %f %f"
|
Printf.sprintf "%f %f %f %f"
|
||||||
(Pdf.getnum a) (Pdf.getnum b) (Pdf.getnum c) (Pdf.getnum d)
|
(Pdf.getnum pdf a) (Pdf.getnum pdf b) (Pdf.getnum pdf c) (Pdf.getnum pdf d)
|
||||||
| _ -> ""
|
| _ -> ""
|
||||||
and rotation page =
|
and rotation page =
|
||||||
Pdfpage.int_of_rotation page.Pdfpage.rotate
|
Pdfpage.int_of_rotation page.Pdfpage.rotate
|
||||||
|
@ -69,13 +69,13 @@ let hard_box pdf range boxname mediabox_if_missing fast =
|
||||||
(Cpdfutil.ppstub (fun pagenum page ->
|
(Cpdfutil.ppstub (fun pagenum page ->
|
||||||
let minx, miny, maxx, maxy =
|
let minx, miny, maxx, maxy =
|
||||||
if boxname = "/MediaBox" then
|
if boxname = "/MediaBox" then
|
||||||
Pdf.parse_rectangle page.Pdfpage.mediabox
|
Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
else
|
else
|
||||||
match Pdf.lookup_direct pdf boxname page.Pdfpage.rest with
|
match Pdf.lookup_direct pdf boxname page.Pdfpage.rest with
|
||||||
| Some a -> Pdf.parse_rectangle a
|
| Some a -> Pdf.parse_rectangle pdf a
|
||||||
| _ ->
|
| _ ->
|
||||||
if mediabox_if_missing
|
if mediabox_if_missing
|
||||||
then Pdf.parse_rectangle page.Pdfpage.mediabox
|
then Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
else error (Printf.sprintf "hard_box: box %s not found" boxname)
|
else error (Printf.sprintf "hard_box: box %s not found" boxname)
|
||||||
in
|
in
|
||||||
let ops = [Pdfops.Op_re (minx, miny, maxx -. minx, maxy -. miny); Pdfops.Op_W; Pdfops.Op_n] in
|
let ops = [Pdfops.Op_re (minx, miny, maxx -. minx, maxy -. miny); Pdfops.Op_W; Pdfops.Op_n] in
|
||||||
|
@ -120,7 +120,7 @@ let change_boxes f pdf page =
|
||||||
fold_left
|
fold_left
|
||||||
(fun e (k, v) ->
|
(fun e (k, v) ->
|
||||||
let v =
|
let v =
|
||||||
make_mediabox (f (Pdf.parse_rectangle v))
|
make_mediabox (f (Pdf.parse_rectangle pdf v))
|
||||||
in
|
in
|
||||||
Pdf.replace_dict_entry e k v)
|
Pdf.replace_dict_entry e k v)
|
||||||
page.Pdfpage.rest
|
page.Pdfpage.rest
|
||||||
|
@ -128,7 +128,7 @@ let change_boxes f pdf page =
|
||||||
in
|
in
|
||||||
{page with
|
{page with
|
||||||
Pdfpage.mediabox =
|
Pdfpage.mediabox =
|
||||||
make_mediabox (f (Pdf.parse_rectangle page.Pdfpage.mediabox));
|
make_mediabox (f (Pdf.parse_rectangle pdf page.Pdfpage.mediabox));
|
||||||
Pdfpage.rest = rest'}
|
Pdfpage.rest = rest'}
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,6 +137,7 @@ let scale_page_contents ?(fast=false) scale position pdf pnum page =
|
||||||
let (minx, miny, maxx, maxy) as box =
|
let (minx, miny, maxx, maxy) as box =
|
||||||
(* Use cropbox if available *)
|
(* Use cropbox if available *)
|
||||||
Pdf.parse_rectangle
|
Pdf.parse_rectangle
|
||||||
|
pdf
|
||||||
(match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
(match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
||||||
| Some r -> r
|
| Some r -> r
|
||||||
| None -> page.Pdfpage.mediabox)
|
| None -> page.Pdfpage.mediabox)
|
||||||
|
@ -234,16 +235,16 @@ to save time. *)
|
||||||
let allupright range pdf =
|
let allupright range pdf =
|
||||||
let page_is_upright page =
|
let page_is_upright page =
|
||||||
page.Pdfpage.rotate = Pdfpage.Rotate0 &&
|
page.Pdfpage.rotate = Pdfpage.Rotate0 &&
|
||||||
(let (minx, miny, _, _) = Pdf.parse_rectangle page.Pdfpage.mediabox in
|
(let (minx, miny, _, _) = Pdf.parse_rectangle pdf page.Pdfpage.mediabox in
|
||||||
minx < 0.001 && miny < 0.001 && minx > ~-.0.001 && miny > ~-.0.001)
|
minx < 0.001 && miny < 0.001 && minx > ~-.0.001 && miny > ~-.0.001)
|
||||||
in
|
in
|
||||||
not (mem false (map page_is_upright (select_pages range pdf)))
|
not (mem false (map page_is_upright (select_pages range pdf)))
|
||||||
|
|
||||||
let upright_transform page =
|
let upright_transform pdf page =
|
||||||
let rotate =
|
let rotate =
|
||||||
Pdfpage.int_of_rotation page.Pdfpage.rotate
|
Pdfpage.int_of_rotation page.Pdfpage.rotate
|
||||||
and cx, cy =
|
and cx, cy =
|
||||||
let minx, miny, maxx, maxy = Pdf.parse_rectangle page.Pdfpage.mediabox in
|
let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf page.Pdfpage.mediabox in
|
||||||
(minx +. maxx) /. 2., (miny +. maxy) /. 2.
|
(minx +. maxx) /. 2., (miny +. maxy) /. 2.
|
||||||
in
|
in
|
||||||
Pdftransform.mkrotate (cx, cy) (rad_of_deg (~-.(float rotate)))
|
Pdftransform.mkrotate (cx, cy) (rad_of_deg (~-.(float rotate)))
|
||||||
|
@ -267,7 +268,7 @@ operations simpler to think about. Any shift that is done is reflected in
|
||||||
other boxes (clip etc.) *)
|
other boxes (clip etc.) *)
|
||||||
let rectify_boxes ?(fast=false) pdf page =
|
let rectify_boxes ?(fast=false) pdf page =
|
||||||
let minx, miny, _, _ =
|
let minx, miny, _, _ =
|
||||||
Pdf.parse_rectangle page.Pdfpage.mediabox
|
Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
in
|
in
|
||||||
let f (iminx, iminy, imaxx, imaxy) =
|
let f (iminx, iminy, imaxx, imaxy) =
|
||||||
iminx -. minx, iminy -. miny, imaxx -. minx, imaxy -. miny
|
iminx -. minx, iminy -. miny, imaxx -. minx, imaxy -. miny
|
||||||
|
@ -281,7 +282,7 @@ let rectify_boxes ?(fast=false) pdf page =
|
||||||
let upright ?(fast=false) range pdf =
|
let upright ?(fast=false) range pdf =
|
||||||
if allupright range pdf then pdf else
|
if allupright range pdf then pdf else
|
||||||
let upright_page _ pnum page =
|
let upright_page _ pnum page =
|
||||||
let tr = upright_transform page in
|
let tr = upright_transform pdf page in
|
||||||
let page = transform_boxes tr pdf page in
|
let page = transform_boxes tr pdf page in
|
||||||
let page = transform_contents ~fast tr pdf page in
|
let page = transform_contents ~fast tr pdf page in
|
||||||
(rectify_boxes ~fast pdf {page with Pdfpage.rotate = Pdfpage.Rotate0}, pnum, tr)
|
(rectify_boxes ~fast pdf {page with Pdfpage.rotate = Pdfpage.Rotate0}, pnum, tr)
|
||||||
|
@ -307,7 +308,7 @@ let rotate_page_contents ~fast rotpoint r pdf pnum page =
|
||||||
let rotation_point =
|
let rotation_point =
|
||||||
match rotpoint with
|
match rotpoint with
|
||||||
| None ->
|
| None ->
|
||||||
let minx, miny, maxx, maxy = Pdf.parse_rectangle page.Pdfpage.mediabox in
|
let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf page.Pdfpage.mediabox in
|
||||||
(minx +. maxx) /. 2., (miny +. maxy) /. 2.
|
(minx +. maxx) /. 2., (miny +. maxy) /. 2.
|
||||||
| Some point -> point
|
| Some point -> point
|
||||||
in
|
in
|
||||||
|
@ -353,6 +354,7 @@ let scale_to_fit_pdf ?(fast=false) position input_scale xylist op pdf range =
|
||||||
let (minx, miny, maxx, maxy) =
|
let (minx, miny, maxx, maxy) =
|
||||||
(* Use cropbox if available *)
|
(* Use cropbox if available *)
|
||||||
Pdf.parse_rectangle
|
Pdf.parse_rectangle
|
||||||
|
pdf
|
||||||
(match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
(match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
||||||
| Some r -> r
|
| Some r -> r
|
||||||
| None -> page.Pdfpage.mediabox)
|
| None -> page.Pdfpage.mediabox)
|
||||||
|
@ -417,7 +419,7 @@ let hasbox pdf page boxname =
|
||||||
(* Flip pages *)
|
(* Flip pages *)
|
||||||
let flip_page ?(fast=false) transform_op pdf pnum page =
|
let flip_page ?(fast=false) transform_op pdf pnum page =
|
||||||
let minx, miny, maxx, maxy =
|
let minx, miny, maxx, maxy =
|
||||||
Pdf.parse_rectangle page.Pdfpage.mediabox
|
Pdf.parse_rectangle pdf page.Pdfpage.mediabox
|
||||||
in
|
in
|
||||||
let tr = transform_op minx miny maxx maxy in
|
let tr = transform_op minx miny maxx maxy in
|
||||||
let page = Cpdfutil.change_pattern_matrices_page pdf tr page in
|
let page = Cpdfutil.change_pattern_matrices_page pdf tr page in
|
||||||
|
@ -484,9 +486,11 @@ let do_stamp relative_to_cropbox fast position topline midline scale_to_fit isov
|
||||||
(* Scale page stamp o to fit page u *)
|
(* Scale page stamp o to fit page u *)
|
||||||
let sxmin, symin, sxmax, symax =
|
let sxmin, symin, sxmax, symax =
|
||||||
Pdf.parse_rectangle
|
Pdf.parse_rectangle
|
||||||
|
pdf
|
||||||
(match Pdf.lookup_direct pdf "/CropBox" o.Pdfpage.rest with | Some r -> r | None -> o.Pdfpage.mediabox)
|
(match Pdf.lookup_direct pdf "/CropBox" o.Pdfpage.rest with | Some r -> r | None -> o.Pdfpage.mediabox)
|
||||||
in let txmin, tymin, txmax, tymax =
|
in let txmin, tymin, txmax, tymax =
|
||||||
Pdf.parse_rectangle
|
Pdf.parse_rectangle
|
||||||
|
pdf
|
||||||
(match Pdf.lookup_direct pdf "/CropBox" u.Pdfpage.rest with | Some r -> r | None -> u.Pdfpage.mediabox)
|
(match Pdf.lookup_direct pdf "/CropBox" u.Pdfpage.rest with | Some r -> r | None -> u.Pdfpage.mediabox)
|
||||||
in
|
in
|
||||||
let o =
|
let o =
|
||||||
|
@ -688,11 +692,11 @@ let crop_pdf ?(box="/CropBox") xywhlist pdf range =
|
||||||
let get_rectangle pdf page box =
|
let get_rectangle pdf page box =
|
||||||
if box = "/MediaBox" then
|
if box = "/MediaBox" then
|
||||||
match page.Pdfpage.mediabox with
|
match page.Pdfpage.mediabox with
|
||||||
Pdf.Array [a; b; c; d] as r -> Some (Pdf.parse_rectangle r)
|
Pdf.Array [a; b; c; d] as r -> Some (Pdf.parse_rectangle pdf r)
|
||||||
| _ -> None
|
| _ -> None
|
||||||
else
|
else
|
||||||
match Pdf.lookup_direct pdf box page.Pdfpage.rest with
|
match Pdf.lookup_direct pdf box page.Pdfpage.rest with
|
||||||
Some (Pdf.Array [a; b; c; d] as r) -> Some (Pdf.parse_rectangle r)
|
Some (Pdf.Array [a; b; c; d] as r) -> Some (Pdf.parse_rectangle pdf r)
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
let show_boxes_page fast pdf _ page =
|
let show_boxes_page fast pdf _ page =
|
||||||
|
|
|
@ -19,8 +19,8 @@ let rec splitat_commas toks =
|
||||||
| some, [] -> [some]
|
| some, [] -> [some]
|
||||||
| _::_ as before, _::rest -> before::splitat_commas rest
|
| _::_ as before, _::rest -> before::splitat_commas rest
|
||||||
|
|
||||||
let is_dimension comparison {Pdfpage.mediabox = box} =
|
let is_dimension pdf comparison {Pdfpage.mediabox = box} =
|
||||||
let minx, miny, maxx, maxy = Pdf.parse_rectangle box in
|
let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf box in
|
||||||
comparison (maxx -. minx) (maxy -. miny)
|
comparison (maxx -. minx) (maxy -. miny)
|
||||||
|
|
||||||
let select_dimensions comparison pdf candidates =
|
let select_dimensions comparison pdf candidates =
|
||||||
|
@ -34,7 +34,7 @@ let select_dimensions comparison pdf candidates =
|
||||||
in
|
in
|
||||||
option_map2
|
option_map2
|
||||||
(fun pagenum page ->
|
(fun pagenum page ->
|
||||||
if is_dimension comparison page then Some pagenum else None)
|
if is_dimension pdf comparison page then Some pagenum else None)
|
||||||
pagenums
|
pagenums
|
||||||
kept_pages
|
kept_pages
|
||||||
|
|
||||||
|
|
|
@ -47,14 +47,14 @@ let typeset_table_of_contents ~font ~fontsize ~title ~bookmark pdf =
|
||||||
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
let firstpage = hd (Pdfpage.pages_of_pagetree pdf) in
|
||||||
let width, firstpage_papersize, pmaxx, pmaxy, margin =
|
let width, firstpage_papersize, pmaxx, pmaxy, margin =
|
||||||
let width, height, xmax, ymax =
|
let width, height, xmax, ymax =
|
||||||
match Pdf.parse_rectangle firstpage.Pdfpage.mediabox with
|
match Pdf.parse_rectangle pdf firstpage.Pdfpage.mediabox with
|
||||||
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin, xmax, ymax
|
xmin, ymin, xmax, ymax -> xmax -. xmin, ymax -. ymin, xmax, ymax
|
||||||
in
|
in
|
||||||
width, Pdfpaper.make Pdfunits.PdfPoint width height, xmax, ymax, fmin width height *. 0.1
|
width, Pdfpaper.make Pdfunits.PdfPoint width height, xmax, ymax, fmin width height *. 0.1
|
||||||
in
|
in
|
||||||
let firstpage_cropbox =
|
let firstpage_cropbox =
|
||||||
match Pdf.lookup_direct pdf "/CropBox" firstpage.Pdfpage.rest with
|
match Pdf.lookup_direct pdf "/CropBox" firstpage.Pdfpage.rest with
|
||||||
| Some r -> Some (Pdf.parse_rectangle r)
|
| Some r -> Some (Pdf.parse_rectangle pdf r)
|
||||||
| None -> None
|
| None -> None
|
||||||
in
|
in
|
||||||
let width =
|
let width =
|
||||||
|
|
|
@ -203,7 +203,7 @@ let thinlines range width pdf =
|
||||||
| None -> []
|
| None -> []
|
||||||
| Some gdict ->
|
| Some gdict ->
|
||||||
match Pdf.lookup_direct pdf "/LW" gdict with
|
match Pdf.lookup_direct pdf "/LW" gdict with
|
||||||
| Some s -> (try [Pdfops.Op_w (Pdf.getnum s)] with _ -> [])
|
| Some s -> (try [Pdfops.Op_w (Pdf.getnum pdf s)] with _ -> [])
|
||||||
| None -> []
|
| None -> []
|
||||||
in
|
in
|
||||||
replace_operators (opw @ ((Pdfops.Op_gs gsname)::prev)) more
|
replace_operators (opw @ ((Pdfops.Op_gs gsname)::prev)) more
|
||||||
|
|
22
cpdfutil.ml
22
cpdfutil.ml
|
@ -133,8 +133,8 @@ let combine_pdf_resources pdf a b =
|
||||||
(Pdf.Dictionary [])
|
(Pdf.Dictionary [])
|
||||||
(unknown_keys_a @ unknown_keys_b @ combined_known_entries)
|
(unknown_keys_a @ unknown_keys_b @ combined_known_entries)
|
||||||
|
|
||||||
let transform_rect transform rect =
|
let transform_rect pdf transform rect =
|
||||||
let minx, miny, maxx, maxy = Pdf.parse_rectangle rect in
|
let minx, miny, maxx, maxy = Pdf.parse_rectangle pdf rect in
|
||||||
let (x0, y0) = Pdftransform.transform_matrix transform (minx, miny) in
|
let (x0, y0) = Pdftransform.transform_matrix transform (minx, miny) in
|
||||||
let (x1, y1) = Pdftransform.transform_matrix transform (maxx, maxy) in
|
let (x1, y1) = Pdftransform.transform_matrix transform (maxx, maxy) in
|
||||||
let (x2, y2) = Pdftransform.transform_matrix transform (minx, maxy) in
|
let (x2, y2) = Pdftransform.transform_matrix transform (minx, maxy) in
|
||||||
|
@ -145,13 +145,13 @@ let transform_rect transform rect =
|
||||||
let maxy = fmax (fmax y0 y1) (fmax y2 y3) 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]
|
Pdf.Array [Pdf.Real minx; Pdf.Real miny; Pdf.Real maxx; Pdf.Real maxy]
|
||||||
|
|
||||||
let transform_quadpoint_single transform = function
|
let transform_quadpoint_single pdf transform = function
|
||||||
| [x1; y1; x2; y2; x3; y3; x4; y4] ->
|
| [x1; y1; x2; y2; x3; y3; x4; y4] ->
|
||||||
let x1, y1, x2, y2, x3, y3, x4, y4 =
|
let x1, y1, x2, y2, x3, y3, x4, y4 =
|
||||||
Pdf.getnum x1, Pdf.getnum y1,
|
Pdf.getnum pdf x1, Pdf.getnum pdf y1,
|
||||||
Pdf.getnum x2, Pdf.getnum y2,
|
Pdf.getnum pdf x2, Pdf.getnum pdf y2,
|
||||||
Pdf.getnum x3, Pdf.getnum y3,
|
Pdf.getnum pdf x3, Pdf.getnum pdf y3,
|
||||||
Pdf.getnum x4, Pdf.getnum y4
|
Pdf.getnum pdf x4, Pdf.getnum pdf y4
|
||||||
in
|
in
|
||||||
let (x1, y1) = Pdftransform.transform_matrix transform (x1, y1) in
|
let (x1, y1) = Pdftransform.transform_matrix transform (x1, y1) in
|
||||||
let (x2, y2) = Pdftransform.transform_matrix transform (x2, y2) in
|
let (x2, y2) = Pdftransform.transform_matrix transform (x2, y2) in
|
||||||
|
@ -162,9 +162,9 @@ let transform_quadpoint_single transform = function
|
||||||
Printf.eprintf "Malformed /QuadPoints format: must be a multiple of 8 entries\n";
|
Printf.eprintf "Malformed /QuadPoints format: must be a multiple of 8 entries\n";
|
||||||
qp
|
qp
|
||||||
|
|
||||||
let transform_quadpoints transform = function
|
let transform_quadpoints pdf transform = function
|
||||||
| Pdf.Array qps ->
|
| Pdf.Array qps ->
|
||||||
Pdf.Array (flatten (map (transform_quadpoint_single transform) (splitinto 8 qps)))
|
Pdf.Array (flatten (map (transform_quadpoint_single pdf transform) (splitinto 8 qps)))
|
||||||
| qp ->
|
| qp ->
|
||||||
Printf.eprintf "Unknown or malformed /QuadPoints format %s\n" (Pdfwrite.string_of_pdf qp);
|
Printf.eprintf "Unknown or malformed /QuadPoints format %s\n" (Pdfwrite.string_of_pdf qp);
|
||||||
qp
|
qp
|
||||||
|
@ -180,12 +180,12 @@ let transform_annotations pdf transform rest =
|
||||||
let annot = Pdf.lookup_obj pdf i in
|
let annot = Pdf.lookup_obj pdf i in
|
||||||
let rect' =
|
let rect' =
|
||||||
match Pdf.lookup_direct pdf "/Rect" annot with
|
match Pdf.lookup_direct pdf "/Rect" annot with
|
||||||
| Some rect -> transform_rect transform rect
|
| Some rect -> transform_rect pdf transform rect
|
||||||
| None -> raise (Pdf.PDFError "transform_annotations: no rect")
|
| None -> raise (Pdf.PDFError "transform_annotations: no rect")
|
||||||
in
|
in
|
||||||
let quadpoints' =
|
let quadpoints' =
|
||||||
match Pdf.lookup_direct pdf "/QuadPoints" annot with
|
match Pdf.lookup_direct pdf "/QuadPoints" annot with
|
||||||
| Some qp -> Some (transform_quadpoints transform qp)
|
| Some qp -> Some (transform_quadpoints pdf transform qp)
|
||||||
| None -> None
|
| None -> None
|
||||||
in
|
in
|
||||||
let annot = Pdf.add_dict_entry annot "/Rect" rect' in
|
let annot = Pdf.add_dict_entry annot "/Rect" rect' in
|
||||||
|
|
Loading…
Reference in New Issue