New @N@@@ etc options
This commit is contained in:
parent
476c5fda5d
commit
017edbbd5e
34
cpdf.ml
34
cpdf.ml
|
@ -1317,40 +1317,6 @@ let get_bookmark_name pdf marks splitlevel n _ =
|
||||||
| {Pdfmarks.text = title}::_ -> remove_unsafe_characters title
|
| {Pdfmarks.text = title}::_ -> remove_unsafe_characters title
|
||||||
| _ -> ""
|
| _ -> ""
|
||||||
|
|
||||||
(* @F means filename without extension *)
|
|
||||||
(* @N means sequence number with no padding *)
|
|
||||||
(* @S means start page of this section *)
|
|
||||||
(* @E means end page of this section *)
|
|
||||||
(* @B means bookmark name at start page *)
|
|
||||||
let process_others marks pdf splitlevel filename sequence startpage endpage s =
|
|
||||||
let rec procss prev = function
|
|
||||||
| [] -> rev prev
|
|
||||||
| '@'::'F'::t -> procss (rev (explode filename) @ prev) t
|
|
||||||
| '@'::'N'::t -> procss (rev (explode (string_of_int sequence)) @ prev) t
|
|
||||||
| '@'::'S'::t -> procss (rev (explode (string_of_int startpage)) @ prev) t
|
|
||||||
| '@'::'E'::t -> procss (rev (explode (string_of_int endpage)) @ prev) t
|
|
||||||
| '@'::'B'::t -> procss (rev (explode (get_bookmark_name pdf marks splitlevel startpage pdf)) @ prev) t
|
|
||||||
| h::t -> procss (h::prev) t
|
|
||||||
in
|
|
||||||
implode (procss [] (explode s))
|
|
||||||
|
|
||||||
let name_of_spec marks (pdf : Pdf.t) splitlevel spec n filename startpage endpage =
|
|
||||||
let fill l n =
|
|
||||||
let chars = explode (string_of_int n) in
|
|
||||||
if length chars > l
|
|
||||||
then implode (drop chars (length chars - l))
|
|
||||||
else implode ((many '0' (l - length chars)) @ chars)
|
|
||||||
in
|
|
||||||
let chars = explode spec in
|
|
||||||
let before, including = cleavewhile (neq '%') chars in
|
|
||||||
let percents, after = cleavewhile (eq '%') including in
|
|
||||||
if percents = []
|
|
||||||
then
|
|
||||||
process_others marks pdf splitlevel filename n startpage endpage spec
|
|
||||||
else
|
|
||||||
process_others marks pdf splitlevel filename n startpage endpage
|
|
||||||
(implode before ^ fill (length percents) n ^ implode after)
|
|
||||||
|
|
||||||
(* Find the stem of a filename *)
|
(* Find the stem of a filename *)
|
||||||
let stem s =
|
let stem s =
|
||||||
implode (rev (tail_no_fail (dropwhile (neq '.') (rev (explode (Filename.basename s))))))
|
implode (rev (tail_no_fail (dropwhile (neq '.') (rev (explode (Filename.basename s))))))
|
||||||
|
|
16
cpdf.mli
16
cpdf.mli
|
@ -80,22 +80,6 @@ val validate_pagespec : string -> bool
|
||||||
|
|
||||||
val parse_pagespec_without_pdf : string -> int list
|
val parse_pagespec_without_pdf : string -> int list
|
||||||
|
|
||||||
(** [name_of_spec printf marks pdf splitlevel spec n filename startpage
|
|
||||||
endpage] makes format substitutions in [spec] to make an output file name:
|
|
||||||
|
|
||||||
{ul
|
|
||||||
{- @F will be replaced by [filename]}
|
|
||||||
{- @N will be replace by the current sequence number [n], [n+1] etc.}
|
|
||||||
{- @S will be replace by the start page}
|
|
||||||
{- @E will be replace by the end page}
|
|
||||||
{- @B will be replace by the bookmark name in [marks] at the given level [splitlevel]}
|
|
||||||
}
|
|
||||||
[printf] is undocumented and should be set to [false].
|
|
||||||
*)
|
|
||||||
val name_of_spec : Pdfmarks.t list -> Pdf.t -> int -> string -> int -> string -> int -> int -> string
|
|
||||||
|
|
||||||
(** {2 Compress and Decompress} *)
|
|
||||||
|
|
||||||
(** Compresses all streams in the PDF document which are uncompressed, using
|
(** Compresses all streams in the PDF document which are uncompressed, using
|
||||||
/FlateDecode, leaving out metadata. If the PDF is encrypted, does nothing. *)
|
/FlateDecode, leaving out metadata. If the PDF is encrypted, does nothing. *)
|
||||||
val recompress_pdf : Pdf.t -> Pdf.t
|
val recompress_pdf : Pdf.t -> Pdf.t
|
||||||
|
|
|
@ -2515,12 +2515,38 @@ let get_bookmark_name pdf marks splitlevel n _ =
|
||||||
(* @E means end page of this section *)
|
(* @E means end page of this section *)
|
||||||
(* @B means bookmark name at start page *)
|
(* @B means bookmark name at start page *)
|
||||||
let process_others marks pdf splitlevel filename sequence startpage endpage s =
|
let process_others marks pdf splitlevel filename sequence startpage endpage s =
|
||||||
|
let rec find_ats p = function
|
||||||
|
'@'::r -> find_ats (p + 1) r
|
||||||
|
| r -> (p, r)
|
||||||
|
in
|
||||||
|
let string_of_int_width w i =
|
||||||
|
if w < 0 then raise (Pdf.PDFError "width of field too narrow")
|
||||||
|
else if w > 8 then raise (Pdf.PDFError "width of field too broad") else
|
||||||
|
let formats =
|
||||||
|
[|format_of_string "%i";
|
||||||
|
format_of_string "%i";
|
||||||
|
format_of_string "%02i";
|
||||||
|
format_of_string "%03i";
|
||||||
|
format_of_string "%04i";
|
||||||
|
format_of_string "%05i";
|
||||||
|
format_of_string "%06i";
|
||||||
|
format_of_string "%07i";
|
||||||
|
format_of_string "%08i"|]
|
||||||
|
in
|
||||||
|
Printf.sprintf formats.(w) i
|
||||||
|
in
|
||||||
let rec procss prev = function
|
let rec procss prev = function
|
||||||
| [] -> rev prev
|
| [] -> rev prev
|
||||||
| '@'::'F'::t -> procss (rev (explode filename) @ prev) t
|
| '@'::'F'::t -> procss (rev (explode filename) @ prev) t
|
||||||
| '@'::'N'::t -> procss (rev (explode (string_of_int sequence)) @ prev) t
|
| '@'::'N'::t ->
|
||||||
| '@'::'S'::t -> procss (rev (explode (string_of_int startpage)) @ prev) t
|
let width, rest = find_ats 0 t in
|
||||||
| '@'::'E'::t -> procss (rev (explode (string_of_int endpage)) @ prev) t
|
procss (rev (explode (string_of_int_width width sequence)) @ prev) rest
|
||||||
|
| '@'::'S'::t ->
|
||||||
|
let width, rest = find_ats 0 t in
|
||||||
|
procss (rev (explode (string_of_int_width width startpage)) @ prev) rest
|
||||||
|
| '@'::'E'::t ->
|
||||||
|
let width, rest = find_ats 0 t in
|
||||||
|
procss (rev (explode (string_of_int_width width endpage)) @ prev) rest
|
||||||
| '@'::'B'::t -> procss (rev (explode (get_bookmark_name pdf marks splitlevel startpage pdf)) @ prev) t
|
| '@'::'B'::t -> procss (rev (explode (get_bookmark_name pdf marks splitlevel startpage pdf)) @ prev) t
|
||||||
| h::t -> procss (h::prev) t
|
| h::t -> procss (h::prev) t
|
||||||
in
|
in
|
||||||
|
@ -2739,7 +2765,7 @@ let extract_images pdf range stem =
|
||||||
(let names =
|
(let names =
|
||||||
map
|
map
|
||||||
(function n ->
|
(function n ->
|
||||||
let r = Cpdf.name_of_spec [] pdf 0 ("p" ^ string_of_int pnum ^ "_" ^ stem) n "" 0 0 in r)
|
let r = name_of_spec [] pdf 0 ("p" ^ string_of_int pnum ^ "_" ^ stem) n "" 0 0 in r)
|
||||||
(indx images)
|
(indx images)
|
||||||
in
|
in
|
||||||
iter2 (write_image pdf page.Pdfpage.resources) names images))
|
iter2 (write_image pdf page.Pdfpage.resources) names images))
|
||||||
|
@ -2758,7 +2784,6 @@ let getencryption pdf =
|
||||||
| Some (Pdfwrite.AES256bitISO true) -> "256bit AES ISO, Metadata encrypted"
|
| Some (Pdfwrite.AES256bitISO true) -> "256bit AES ISO, Metadata encrypted"
|
||||||
| Some (Pdfwrite.AES256bitISO false) -> "256bit AES ISO, Metadata not encrypted"
|
| Some (Pdfwrite.AES256bitISO false) -> "256bit AES ISO, Metadata not encrypted"
|
||||||
|
|
||||||
|
|
||||||
(* If a cropbox exists, make it the mediabox. If not, change nothing. *)
|
(* If a cropbox exists, make it the mediabox. If not, change nothing. *)
|
||||||
let copy_cropbox_to_mediabox pdf range =
|
let copy_cropbox_to_mediabox pdf range =
|
||||||
Cpdf.process_pages
|
Cpdf.process_pages
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
%FIXME: Document -remove-clipping
|
%FIXME: Document -remove-clipping
|
||||||
%FIXME: Document new -list-spot-colours
|
%FIXME: Document new -list-spot-colours
|
||||||
%FIXME: Document new -pad-multiple-before
|
%FIXME: Document new -pad-multiple-before
|
||||||
|
%FIXME: Document new @N@@@ @E@@@, @S@@@ options
|
||||||
|
|
||||||
\documentclass{book}
|
\documentclass{book}
|
||||||
\usepackage{palatino}
|
\usepackage{palatino}
|
||||||
|
|
Loading…
Reference in New Issue