Fix to work with CamlPDF new getnum

This commit is contained in:
John Whitington 2022-07-14 14:06:25 +01:00
parent c99d617bb6
commit 755a4352b5
11 changed files with 77 additions and 73 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 =

View File

@ -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

View File

@ -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 =

View File

@ -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

View File

@ -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