Apparatus for imposition

This commit is contained in:
John Whitington 2021-10-18 18:19:59 +01:00
parent b70615ec16
commit 66e3d3aa1a
2 changed files with 86 additions and 6 deletions

View File

@ -85,6 +85,7 @@ type op =
| CombinePages of string | CombinePages of string
| TwoUp | TwoUp
| TwoUpStack | TwoUpStack
| Impose of bool
| RemoveBookmarks | RemoveBookmarks
| AddBookmarks of string | AddBookmarks of string
| AddText of string | AddText of string
@ -200,6 +201,7 @@ type op =
| StampAsXObject of string | StampAsXObject of string
let string_of_op = function let string_of_op = function
| Impose _ -> "Impose"
| CopyFont _ -> "CopyFont" | CopyFont _ -> "CopyFont"
| CountPages -> "CountPages" | CountPages -> "CountPages"
| Version -> "Version" | Version -> "Version"
@ -455,7 +457,14 @@ type args =
mutable ocgrenameto : string; mutable ocgrenameto : string;
mutable dedup : bool; mutable dedup : bool;
mutable dedup_per_page : bool; mutable dedup_per_page : bool;
mutable collate : bool} mutable collate : bool;
mutable impose_columns : bool;
mutable impose_rtl : bool;
mutable impose_btt : bool;
mutable impose_center : bool;
mutable impose_margin : float;
mutable impose_spacing : float;
mutable impose_linewidth : float}
let args = let args =
{op = None; {op = None;
@ -561,7 +570,14 @@ let args =
ocgrenameto = ""; ocgrenameto = "";
dedup = false; dedup = false;
dedup_per_page = false; dedup_per_page = false;
collate = false;} collate = false;
impose_columns = false;
impose_rtl = false;
impose_btt = false;
impose_center = false;
impose_margin = 0.;
impose_spacing = 0.;
impose_linewidth = 0.}
let reset_arguments () = let reset_arguments () =
args.op <- None; args.op <- None;
@ -652,7 +668,14 @@ let reset_arguments () =
args.ocgrenameto <- ""; args.ocgrenameto <- "";
args.dedup <- false; args.dedup <- false;
args.dedup_per_page <- false; args.dedup_per_page <- false;
args.collate <- false args.collate <- false;
args.impose_columns <- false;
args.impose_rtl <- false;
args.impose_btt <- false;
args.impose_center <- false;
args.impose_margin <- 0.;
args.impose_spacing <- 0.;
args.impose_linewidth <- 0.
(* Do not reset original_filename or cpdflin or was_encrypted or (* Do not reset original_filename or cpdflin or was_encrypted or
* was_decrypted_with_owner or recrypt or producer or creator or path_to_* or * was_decrypted_with_owner or recrypt or producer or creator or path_to_* or
* gs_malformed or gs_quiet, since we want these to work across ANDs. Or * gs_malformed or gs_quiet, since we want these to work across ANDs. Or
@ -721,7 +744,7 @@ let banned banlist = function
| Decrypt | Encrypt | CombinePages _ -> true (* Never allowed *) | Decrypt | Encrypt | CombinePages _ -> true (* Never allowed *)
| AddBookmarks _ | PadBefore | PadAfter | PadEvery _ | PadMultiple _ | PadMultipleBefore _ | AddBookmarks _ | PadBefore | PadAfter | PadEvery _ | PadMultiple _ | PadMultipleBefore _
| Merge | Split | SplitOnBookmarks _ | RotateContents _ | Rotate _ | Merge | Split | SplitOnBookmarks _ | RotateContents _ | Rotate _
| Rotateby _ | Upright | VFlip | HFlip -> | Rotateby _ | Upright | VFlip | HFlip | Impose _ ->
mem Pdfcrypt.NoAssemble banlist mem Pdfcrypt.NoAssemble banlist
| TwoUp|TwoUpStack|RemoveBookmarks|AddRectangle|RemoveText| | TwoUp|TwoUpStack|RemoveBookmarks|AddRectangle|RemoveText|
Draft|Shift|Scale|ScaleToFit|RemoveAttachedFiles| Draft|Shift|Scale|ScaleToFit|RemoveAttachedFiles|
@ -1523,6 +1546,35 @@ let set_dedup_per_page () =
let setcollate () = let setcollate () =
args.collate <- true args.collate <- true
let setimposecolumns () =
args.impose_columns <- true
let setimposertl () =
args.impose_rtl <- true
let setimposebtt () =
args.impose_btt <- true
let setimposecenter () =
args.impose_center <- true
let setimpose s =
setop (Impose true) ();
args.coord <- s
let setimposexy s =
setop (Impose false) ();
args.coord <- s
let setimposemargin f =
args.impose_margin <- f
let setimposespacing f =
args.impose_spacing <- f
let setimposelinewidth f =
args.impose_linewidth <- f
let whingemalformed () = let whingemalformed () =
prerr_string "Command line must be of exactly the form\ncpdf <infile> -gs <path> -gs-malformed-force -o <outfile>\n"; prerr_string "Command line must be of exactly the form\ncpdf <infile> -gs <path> -gs-malformed-force -o <outfile>\n";
exit 1 exit 1
@ -1908,6 +1960,33 @@ and specs =
("-twoup-stack", ("-twoup-stack",
Arg.Unit (setop TwoUpStack), Arg.Unit (setop TwoUpStack),
" Stack 2 pages onto one twice the size"); " Stack 2 pages onto one twice the size");
("-impose",
Arg.String setimpose,
" Impose onto given page size");
("-impose-xy",
Arg.String setimposexy,
" Impose x by y (zero means unlimited)");
("-impose-columns",
Arg.Unit setimposecolumns,
" Impose in columns rather than rows");
("-impose-rtl",
Arg.Unit setimposertl,
" Impose right-to-left on rows");
("-impose-btt",
Arg.Unit setimposebtt,
" Impose bottom-to-top on columns");
("-impose-center",
Arg.Unit setimposecenter,
" Center last partly-empty row or column");
("-impose-margin",
Arg.Float setimposemargin,
" Add margin around whole imposed page");
("-impose-spacing",
Arg.Float setimposespacing,
" Add spacing around each imposed page");
("-impose-linewidth",
Arg.Float setimposelinewidth,
" Imposition divider line width (0=none)");
("-pad-before", ("-pad-before",
Arg.Unit (setop PadBefore), Arg.Unit (setop PadBefore),
" Add a blank page before the given pages"); " Add a blank page before the given pages");
@ -2912,8 +2991,6 @@ let copy_cropbox_to_mediabox pdf range =
pdf pdf
range 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. *)
@ -3953,6 +4030,8 @@ let go () =
write_pdf false (Cpdf.twoup args.fast (get_single_pdf args.op false)) write_pdf false (Cpdf.twoup args.fast (get_single_pdf args.op false))
| Some TwoUpStack -> | Some TwoUpStack ->
write_pdf false (Cpdf.twoup_stack args.fast (get_single_pdf args.op false)) write_pdf false (Cpdf.twoup_stack args.fast (get_single_pdf args.op false))
| Some Impose x ->
write_pdf false (get_single_pdf args.op false)
| Some (StampOn over) -> | Some (StampOn over) ->
let overpdf = let overpdf =
match over with match over with

View File

@ -1,6 +1,7 @@
%Document the new JSON format, -j and new -output-json options %Document the new JSON format, -j and new -output-json options
%Document -decrypt-force %Document -decrypt-force
%Document -collate %Document -collate
%Document -impose and friends
\documentclass{book} \documentclass{book}
% Edit here to produce cpdfmanual.pdf, cpdflibmanual.pdf, pycpdfmanual.pdf etc. % Edit here to produce cpdfmanual.pdf, cpdflibmanual.pdf, pycpdfmanual.pdf etc.