CSP code archived
This commit is contained in:
parent
5ae9ffe25f
commit
268228df40
57
cpdf.ml
57
cpdf.ml
|
@ -3739,63 +3739,6 @@ let draft onlyremove boxes range pdf =
|
||||||
let set_version v pdf =
|
let set_version v pdf =
|
||||||
pdf.Pdf.minor <- v
|
pdf.Pdf.minor <- v
|
||||||
|
|
||||||
(* Custom Code: CSP1 - four up duplication. Alter media box and crop-box. 4-up the data. *)
|
|
||||||
let custom_csp1_page pdf _ page =
|
|
||||||
let minx, miny, maxx, maxy =
|
|
||||||
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
|
||||||
| Some r -> Pdf.parse_rectangle r
|
|
||||||
| None -> Pdf.parse_rectangle page.Pdfpage.mediabox
|
|
||||||
in
|
|
||||||
let mx0 = -.minx
|
|
||||||
in let my0 = -.miny
|
|
||||||
in let dx = maxx -. minx
|
|
||||||
in let dy = maxy -. miny in
|
|
||||||
let content =
|
|
||||||
let ops =
|
|
||||||
Pdfops.parse_operators pdf page.Pdfpage.resources page.Pdfpage.content
|
|
||||||
in
|
|
||||||
[Pdfops.Op_q;
|
|
||||||
Pdfops.Op_cm (Pdftransform.matrix_of_transform [Pdftransform.Translate (mx0, my0)])] @ ops @ [Pdfops.Op_Q] @
|
|
||||||
[Pdfops.Op_q;
|
|
||||||
Pdfops.Op_cm (Pdftransform.matrix_of_transform [Pdftransform.Translate (mx0 +. dx, my0 +. dy)])] @ ops @ [Pdfops.Op_Q] @
|
|
||||||
[Pdfops.Op_q;
|
|
||||||
Pdfops.Op_cm (Pdftransform.matrix_of_transform [Pdftransform.Translate (mx0, my0 +. dy)])] @ ops @ [Pdfops.Op_Q] @
|
|
||||||
[Pdfops.Op_q;
|
|
||||||
Pdfops.Op_cm (Pdftransform.matrix_of_transform [Pdftransform.Translate (mx0 +. dx, my0)])] @ ops @ [Pdfops.Op_Q]
|
|
||||||
in
|
|
||||||
let new_mediabox =
|
|
||||||
Pdf.Array
|
|
||||||
[Pdf.Real 0.;
|
|
||||||
Pdf.Real 0.;
|
|
||||||
Pdf.Real ((maxx -. minx) *. 2.);
|
|
||||||
Pdf.Real ((maxy -. miny) *. 2.)]
|
|
||||||
in
|
|
||||||
{page with
|
|
||||||
Pdfpage.content = [Pdfops.stream_of_ops content];
|
|
||||||
Pdfpage.mediabox = new_mediabox;
|
|
||||||
Pdfpage.rest = Pdf.add_dict_entry page.Pdfpage.rest "/CropBox" new_mediabox}
|
|
||||||
|
|
||||||
let custom_csp1 pdf =
|
|
||||||
process_pages (ppstub (custom_csp1_page pdf)) pdf (ilist 1 (Pdfpage.endpage pdf))
|
|
||||||
|
|
||||||
let custom_csp2 f pdf =
|
|
||||||
let page = hd (Pdfpage.pages_of_pagetree pdf) in
|
|
||||||
let m_minx, m_miny, m_maxx, m_maxy =
|
|
||||||
match page.Pdfpage.mediabox with
|
|
||||||
| Pdf.Array [a; b; c; d] ->
|
|
||||||
Pdf.getnum a, Pdf.getnum b, Pdf.getnum c, Pdf.getnum d
|
|
||||||
| _ -> 0., 0., 0., 0.
|
|
||||||
in
|
|
||||||
let c_minx, c_miny, c_maxx, c_maxy =
|
|
||||||
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
|
||||||
| Some (Pdf.Array [a; b; c; d]) ->
|
|
||||||
Pdf.getnum a, Pdf.getnum b, Pdf.getnum c, Pdf.getnum d
|
|
||||||
| _ -> m_minx, m_miny, m_maxx, m_maxy
|
|
||||||
in
|
|
||||||
let x = (c_minx +. c_maxx) /. 2.
|
|
||||||
in let y = (c_miny +. c_maxy) /. 2. in
|
|
||||||
scale_contents (PosCentre (x, y)) (f /. 100.) pdf (ilist 1 (Pdfpage.endpage pdf))
|
|
||||||
|
|
||||||
let blank_document width height pages =
|
let blank_document width height pages =
|
||||||
let pdf_pages =
|
let pdf_pages =
|
||||||
map (fun () -> Pdfpage.blankpage (Pdfpaper.make Pdfunits.PdfPoint width height)) (many () pages)
|
map (fun () -> Pdfpage.blankpage (Pdfpaper.make Pdfunits.PdfPoint width height)) (many () pages)
|
||||||
|
|
6
cpdf.mli
6
cpdf.mli
|
@ -354,12 +354,6 @@ val remove_all_text : int list -> Pdf.t -> Pdf.t
|
||||||
|
|
||||||
val process_xobjects : Pdf.t -> Pdfpage.t -> (Pdf.t -> Pdf.pdfobject -> Pdf.pdfobject list -> Pdf.pdfobject list) -> unit
|
val process_xobjects : Pdf.t -> Pdfpage.t -> (Pdf.t -> Pdf.pdfobject -> Pdf.pdfobject list -> Pdf.pdfobject list) -> unit
|
||||||
|
|
||||||
(** Custom CSP1 *)
|
|
||||||
val custom_csp1 : Pdf.t -> Pdf.t
|
|
||||||
|
|
||||||
(** Custom CSP2 *)
|
|
||||||
val custom_csp2 : float -> Pdf.t -> Pdf.t
|
|
||||||
|
|
||||||
(** Nobble a page, given pdf, pagenumber and page *)
|
(** Nobble a page, given pdf, pagenumber and page *)
|
||||||
val nobble_page : Pdf.t -> 'a -> Pdfpage.t -> Pdfpage.t
|
val nobble_page : Pdf.t -> 'a -> Pdfpage.t -> Pdfpage.t
|
||||||
|
|
||||||
|
|
|
@ -76,9 +76,6 @@ let parse_pagespec_allow_empty pdf spec =
|
||||||
(* Operations. *)
|
(* Operations. *)
|
||||||
type op =
|
type op =
|
||||||
| CopyFont of string
|
| CopyFont of string
|
||||||
| CSP1
|
|
||||||
| CSP2 of float
|
|
||||||
| CSP3
|
|
||||||
| CountPages
|
| CountPages
|
||||||
| Version
|
| Version
|
||||||
| Encrypt
|
| Encrypt
|
||||||
|
@ -204,9 +201,6 @@ type op =
|
||||||
|
|
||||||
let string_of_op = function
|
let string_of_op = function
|
||||||
| CopyFont _ -> "CopyFont"
|
| CopyFont _ -> "CopyFont"
|
||||||
| CSP1 -> "CSP1"
|
|
||||||
| CSP2 _ -> "CSP2"
|
|
||||||
| CSP3 -> "CSP3"
|
|
||||||
| CountPages -> "CountPages"
|
| CountPages -> "CountPages"
|
||||||
| Version -> "Version"
|
| Version -> "Version"
|
||||||
| Encrypt -> "Encrypt"
|
| Encrypt -> "Encrypt"
|
||||||
|
@ -723,11 +717,11 @@ let banned banlist = function
|
||||||
| Merge | Split | SplitOnBookmarks _ | RotateContents _ | Rotate _
|
| Merge | Split | SplitOnBookmarks _ | RotateContents _ | Rotate _
|
||||||
| Rotateby _ | Upright | VFlip | HFlip ->
|
| Rotateby _ | Upright | VFlip | HFlip ->
|
||||||
mem Pdfcrypt.NoAssemble banlist
|
mem Pdfcrypt.NoAssemble banlist
|
||||||
| CSP1|CSP3|TwoUp|TwoUpStack|RemoveBookmarks|AddRectangle|RemoveText|
|
| TwoUp|TwoUpStack|RemoveBookmarks|AddRectangle|RemoveText|
|
||||||
Draft|Shift|Scale|ScaleToFit|RemoveAttachedFiles|
|
Draft|Shift|Scale|ScaleToFit|RemoveAttachedFiles|
|
||||||
RemoveAnnotations|RemoveFonts|Crop|RemoveCrop|Trim|RemoveTrim|Bleed|RemoveBleed|Art|RemoveArt|
|
RemoveAnnotations|RemoveFonts|Crop|RemoveCrop|Trim|RemoveTrim|Bleed|RemoveBleed|Art|RemoveArt|
|
||||||
CopyCropBoxToMediaBox|CopyBox|MediaBox|HardBox _|SetTrapped|SetUntrapped|Presentation|
|
CopyCropBoxToMediaBox|CopyBox|MediaBox|HardBox _|SetTrapped|SetUntrapped|Presentation|
|
||||||
BlackText|BlackLines|BlackFills|CopyFont _|CSP2 _|StampOn _|StampUnder _|StampAsXObject _|
|
BlackText|BlackLines|BlackFills|CopyFont _|StampOn _|StampUnder _|StampAsXObject _|
|
||||||
AddText _|ScaleContents _|AttachFile _|CopyAnnotations _| ThinLines _ | RemoveClipping | RemoveAllText
|
AddText _|ScaleContents _|AttachFile _|CopyAnnotations _| ThinLines _ | RemoveClipping | RemoveAllText
|
||||||
| Prepend _ | Postpend _ ->
|
| Prepend _ | Postpend _ ->
|
||||||
mem Pdfcrypt.NoEdit banlist
|
mem Pdfcrypt.NoEdit banlist
|
||||||
|
@ -1310,10 +1304,6 @@ let setpadmultiplebefore i =
|
||||||
let setfast () =
|
let setfast () =
|
||||||
args.fast <- true
|
args.fast <- true
|
||||||
|
|
||||||
let setcsp2 f =
|
|
||||||
detect_duplicate_op (CSP2 f);
|
|
||||||
args.op <- Some (CSP2 f)
|
|
||||||
|
|
||||||
(* Explicitly add a range. Parse it and replace the top input file with the range. *)
|
(* Explicitly add a range. Parse it and replace the top input file with the range. *)
|
||||||
let setrange spec =
|
let setrange spec =
|
||||||
args.dashrange <- spec;
|
args.dashrange <- spec;
|
||||||
|
@ -2232,9 +2222,6 @@ and specs =
|
||||||
("-remove-unused-resources", Arg.Unit (setop RemoveUnusedResources), "");
|
("-remove-unused-resources", Arg.Unit (setop RemoveUnusedResources), "");
|
||||||
("-stay-on-error", Arg.Unit setstayonerror, "");
|
("-stay-on-error", Arg.Unit setstayonerror, "");
|
||||||
("-extract-fontfile", Arg.Unit (setop ExtractFontFile), "");
|
("-extract-fontfile", Arg.Unit (setop ExtractFontFile), "");
|
||||||
("-csp1", Arg.Unit (setop CSP1), "");
|
|
||||||
("-csp2", Arg.Float setcsp2, "");
|
|
||||||
("-csp3", Arg.Unit (setop CSP3), "");
|
|
||||||
("-text-vertical", Arg.Unit settextvertical, "");
|
("-text-vertical", Arg.Unit settextvertical, "");
|
||||||
("-text-vertical-down", Arg.Unit settextverticaldown, "");
|
("-text-vertical-down", Arg.Unit settextverticaldown, "");
|
||||||
("-flat-kids", Arg.Unit setflatkids, "");
|
("-flat-kids", Arg.Unit setflatkids, "");
|
||||||
|
@ -3103,55 +3090,6 @@ let rec startends_of_range_inner pairs ls =
|
||||||
let startends_of_range x =
|
let startends_of_range x =
|
||||||
startends_of_range_inner [] x
|
startends_of_range_inner [] x
|
||||||
|
|
||||||
|
|
||||||
(* Calculating margins *)
|
|
||||||
let calculate_margins filename pdf (s, e) =
|
|
||||||
(* Call ghostscript *)
|
|
||||||
let gscall =
|
|
||||||
args.path_to_ghostscript ^
|
|
||||||
" -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox -r1200"
|
|
||||||
^ " -dFirstPage="
|
|
||||||
^ string_of_int s
|
|
||||||
^ " -dLastPage=" ^ string_of_int e
|
|
||||||
^ " \"" ^ filename ^ "\"" ^ " > waste.txt 2> margins.txt"
|
|
||||||
in
|
|
||||||
match Sys.command gscall with
|
|
||||||
| 0 ->
|
|
||||||
(* Parse white boxes *)
|
|
||||||
let whiteboxes =
|
|
||||||
parse_whiteboxes "margins.txt"
|
|
||||||
(* Get media boxes *)
|
|
||||||
and mediaboxes =
|
|
||||||
take' (e - s + 1)
|
|
||||||
(drop' (s - 1)
|
|
||||||
(map
|
|
||||||
(function page ->
|
|
||||||
(* Prefer the crop box *)
|
|
||||||
match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with
|
|
||||||
| Some pdfobject -> Pdf.parse_rectangle (Pdf.direct pdf pdfobject)
|
|
||||||
| None -> Pdf.parse_rectangle page.Pdfpage.mediabox)
|
|
||||||
(Pdfpage.pages_of_pagetree pdf)))
|
|
||||||
in
|
|
||||||
iter2
|
|
||||||
(fun (m_minx, m_miny, m_maxx, m_maxy) (w_minx, w_miny, w_maxx, w_maxy) ->
|
|
||||||
if w_minx = 0. && w_miny = 0. && w_maxx = 0. && w_maxy = 0. then
|
|
||||||
Printf.printf "100, 100, 100, 100\n"
|
|
||||||
else
|
|
||||||
let topmargin = ((m_maxy -. w_maxy) /. (m_maxy -. m_miny)) *. 100.
|
|
||||||
and bottommargin = ((w_miny -. m_miny) /. (m_maxy -. m_miny)) *. 100.
|
|
||||||
and leftmargin = ((w_minx -. m_minx) /. (m_maxx -. m_minx)) *. 100.
|
|
||||||
and rightmargin = ((m_maxx -. w_maxx) /. (m_maxx -. m_minx)) *. 100. in
|
|
||||||
Printf.printf "%f, %f, %f, %f\n" leftmargin rightmargin topmargin bottommargin)
|
|
||||||
mediaboxes
|
|
||||||
whiteboxes;
|
|
||||||
(* Clean up temp files *)
|
|
||||||
Sys.remove "margins.txt";
|
|
||||||
Sys.remove "waste.txt"
|
|
||||||
| _ -> Printf.eprintf "Call to ghostscript failed.\n%!"
|
|
||||||
|
|
||||||
let calculate_margins filename pdf range =
|
|
||||||
iter (calculate_margins filename pdf) (startends_of_range (sort compare range))
|
|
||||||
|
|
||||||
(* copy the contents of the box f to the box t. If mediabox_if_missing is set,
|
(* copy the contents of the box f to the box t. If mediabox_if_missing is set,
|
||||||
the contents of the mediabox will be used if the from fox is not available. If
|
the contents of the mediabox will be used if the from fox is not available. If
|
||||||
mediabox_is_missing is false, the page is unaltered. *)
|
mediabox_is_missing is false, the page is unaltered. *)
|
||||||
|
@ -4249,19 +4187,6 @@ let go () =
|
||||||
let pdf = get_single_pdf args.op true in
|
let pdf = get_single_pdf args.op true in
|
||||||
let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in
|
let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in
|
||||||
missing_fonts pdf range
|
missing_fonts pdf range
|
||||||
| Some CSP1 ->
|
|
||||||
write_pdf false (Cpdf.custom_csp1 (get_single_pdf (Some CSP1) false))
|
|
||||||
| Some (CSP2 f) ->
|
|
||||||
write_pdf false (Cpdf.custom_csp2 f (get_single_pdf (Some (CSP2 f)) false))
|
|
||||||
| Some CSP3 ->
|
|
||||||
begin match args.inputs with
|
|
||||||
| [(InFile s, _, _, _, _, _)] ->
|
|
||||||
let pdf = get_single_pdf args.op true in
|
|
||||||
let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in
|
|
||||||
calculate_margins s pdf range
|
|
||||||
| _ ->
|
|
||||||
Printf.eprintf "CSP3: Too many input files or input not a file\n%!"
|
|
||||||
end
|
|
||||||
| Some ExtractText ->
|
| Some ExtractText ->
|
||||||
let pdf = get_single_pdf args.op true in
|
let pdf = get_single_pdf args.op true in
|
||||||
let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in
|
let range = parse_pagespec_allow_empty pdf (get_pagespec ()) in
|
||||||
|
|
Loading…
Reference in New Issue