From a4f9d0322f524500fb370fc3374031ec6ba9fd98 Mon Sep 17 00:00:00 2001 From: John Whitington Date: Mon, 6 Oct 2014 14:32:53 +0100 Subject: [PATCH] Fixed -stamp-on/-stamp-under with positions --- cpdf.ml | 423 ++++++++++++++++++++++++++----------------------- cpdf.mli | 37 ++--- cpdfcommand.ml | 26 ++- cpdfmanual.pdf | Bin 207528 -> 207828 bytes cpdfmanual.tex | 5 +- 5 files changed, 257 insertions(+), 234 deletions(-) diff --git a/cpdf.ml b/cpdf.ml index 1af65ff..99c8700 100644 --- a/cpdf.ml +++ b/cpdf.ml @@ -1233,156 +1233,7 @@ let list_bookmarks encoding range pdf output = (if mark.Pdfmarks.isopen then "open" else ""))) inrange -(* \section{Stamping files} *) (* o is the stamp, u is the main pdf page *) -let do_stamp fast scale_to_fit isover pdf o u opdf = - (* Scale page stamp o to fit page u *) - let o = - if scale_to_fit then - let sxmin, symin, sxmax, symax = - Pdf.parse_rectangle - (match Pdf.lookup_direct pdf "/CropBox" o.Pdfpage.rest with | Some r -> r | None -> o.Pdfpage.mediabox) - in let txmin, tymin, txmax, tymax = - Pdf.parse_rectangle - (match Pdf.lookup_direct pdf "/CropBox" u.Pdfpage.rest with | Some r -> r | None -> u.Pdfpage.mediabox) - in - let xmag = (txmax -. txmin) /. (sxmax -. sxmin) - in let ymag = (tymax -. tymin) /. (symax -. symin) in - let scale = - if xmag < 0.999 && ymag < 0.999 then - if xmag > ymag then xmag else ymag - else if xmag >= 1.001 && ymag >= 1.001 then - if xmag > ymag then ymag else xmag - else if xmag >= 1.001 then ymag - else xmag - in - let dx = txmin +. ((txmax -. txmin) -. (sxmax -. sxmin) *. scale) /. 2. - in let dy = tymin +. ((tymax -. tymin) -. (symax -. symin) *. scale) /. 2. in - let scale_op = - Pdfops.Op_cm - (Pdftransform.matrix_of_transform - [Pdftransform.Translate (dx, dy); - Pdftransform.Scale ((sxmin, symin), scale, scale)]) - in - Pdfpage.prepend_operators opdf [scale_op] ~fast o - else - o - in - {u with - Pdfpage.content = - (if isover then ( @ ) else ( @@ )) - [protect_removeme pdf u.Pdfpage.resources u.Pdfpage.content] - [protect_removeme pdf o.Pdfpage.resources o.Pdfpage.content]; - Pdfpage.resources = - combine_pdf_resources pdf u.Pdfpage.resources o.Pdfpage.resources} - -(* Alter bookmark destinations given a hash table of (old page reference - * number, new page reference number) pairings *) -let change_destination t = function - Pdfdest.XYZ (Pdfdest.PageObject p, a, b, c) -> - Pdfdest.XYZ (Pdfdest.PageObject (Hashtbl.find t p), a, b, c) - | Pdfdest.Fit (Pdfdest.PageObject p) -> - Pdfdest.Fit (Pdfdest.PageObject (Hashtbl.find t p)) - | Pdfdest.FitH (Pdfdest.PageObject p, x) -> - Pdfdest.FitH (Pdfdest.PageObject (Hashtbl.find t p), x) - | Pdfdest.FitV (Pdfdest.PageObject p, x) -> - Pdfdest.FitV (Pdfdest.PageObject (Hashtbl.find t p), x) - | Pdfdest.FitR (Pdfdest.PageObject p, a, b, c, d) -> - Pdfdest.FitR (Pdfdest.PageObject (Hashtbl.find t p), a, b, c, d) - | Pdfdest.FitB (Pdfdest.PageObject p) -> - Pdfdest.Fit (Pdfdest.PageObject (Hashtbl.find t p)) - | Pdfdest.FitBH (Pdfdest.PageObject p, x) -> - Pdfdest.FitBH (Pdfdest.PageObject (Hashtbl.find t p), x) - | Pdfdest.FitBV (Pdfdest.PageObject p, x) -> - Pdfdest.FitBV (Pdfdest.PageObject (Hashtbl.find t p), x) - | x -> x - -let change_bookmark t m = - {m with Pdfmarks.target = - try change_destination t m.Pdfmarks.target with Not_found -> m.Pdfmarks.target} - -let stamp (fast : bool) scale_to_fit isover range over pdf = - let marks = Pdfmarks.read_bookmarks pdf in - let marks_refnumbers = Pdf.page_reference_numbers pdf in - let pdf = Pdfmarks.remove_bookmarks pdf in - let over = Pdfmarks.remove_bookmarks over in - let pageseqs = ilist 1 (Pdfpage.endpage pdf) in - let over_firstpage_pdf = - match Pdfpage.pages_of_pagetree over with - | [] -> error "empty PDF" - | h::_ -> Pdfpage.change_pages true over [h] - in - let merged = - Pdfmerge.merge_pdfs - ~rotations:[Pdfmerge.DNR; Pdfmerge.DNR] - false false ["a"; "b"] [pdf; over_firstpage_pdf] [pageseqs; [1]] - in - let renamed_pdf = - Pdfpage.change_pages true - merged (Pdfpage.renumber_pages merged (Pdfpage.pages_of_pagetree merged)) - in - let renamed_pages = Pdfpage.pages_of_pagetree renamed_pdf in - let under_pages, over_page = - all_but_last renamed_pages, last renamed_pages - in - let new_pages = - map2 - (fun pageseq under_page -> - do_stamp fast scale_to_fit isover renamed_pdf - (if mem pageseq range then over_page else - Pdfpage.blankpage Pdfpaper.a4) - under_page over) - pageseqs - under_pages - in - let changed = Pdfpage.change_pages true renamed_pdf new_pages in - let new_refnumbers = Pdf.page_reference_numbers changed in - let changetable = hashtable_of_dictionary (List.combine marks_refnumbers new_refnumbers) in - let new_marks = map (change_bookmark changetable) marks in - Pdfmarks.add_bookmarks new_marks changed - -(* Combine pages from two PDFs. For now, assume equal length. *) - -(* If [over] has more pages than [under], chop the excess. If the converse, pad -[over] to the same length *) -let equalize_pages under over = - let length_under = Pdfpage.endpage under - in let length_over = Pdfpage.endpage over - in - if length_over > length_under then - under, - (Pdfpage.change_pages true over (take (Pdfpage.pages_of_pagetree over) length_under)) - else if length_under > length_over then - under, - Pdfpage.change_pages true - over - (Pdfpage.pages_of_pagetree over @ - (many (Pdfpage.blankpage Pdfpaper.a4) (length_under - length_over))) - else - under, over - -let combine_pages (fast : bool) under over scaletofit swap equalize = - let marks_under = Pdfmarks.read_bookmarks under in - let marks_over = Pdfmarks.read_bookmarks over in - let under, over = if equalize then equalize_pages under over else under, over in - let under_length = Pdfpage.endpage under - in let over_length = Pdfpage.endpage over in - if under_length <> over_length then raise (Pdf.PDFError "combine_pages: not of equal length") else - let pageseqs_under = ilist 1 (Pdfpage.endpage under) - in let pageseqs_over = ilist 1 (Pdfpage.endpage over) in - let merged = - Pdfmerge.merge_pdfs ~rotations: [Pdfmerge.DNR; Pdfmerge.DNR] false false ["a"; "b"] [under; over] [pageseqs_under; pageseqs_over] in - let renamed_pdf = - Pdfpage.change_pages true - merged (Pdfpage.renumber_pages merged (Pdfpage.pages_of_pagetree merged)) - in - let under_pages, over_pages = - cleave (Pdfpage.pages_of_pagetree renamed_pdf) under_length - in - let new_pages = - map2 (fun o u -> do_stamp fast scaletofit (not swap) renamed_pdf o u over) over_pages under_pages - in - Pdfmarks.add_bookmarks (marks_under @ marks_over) (Pdfpage.change_pages true renamed_pdf new_pages) (* \section{Split at bookmarks} *) @@ -1627,56 +1478,6 @@ let print_fonts pdf = flprint (fold_left ( ^ ) "" (map string_of_font (list_fonts pdf))) -(* \section{Nobbling for Demo Version} *) -let nobble_page pdf _ page = - let minx, miny, maxx, maxy = - (* Use cropbox if available *) - Pdf.parse_rectangle - (match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with - | Some r -> r - | None -> page.Pdfpage.mediabox) - in - let fontdict = - match Pdf.lookup_direct pdf "/Font" page.Pdfpage.resources with - | None -> Pdf.Dictionary [] - | Some d -> d - in - let fontname = Pdf.unique_key "F" fontdict in - let width = maxx -. minx in let height = maxy -. miny in - let scalex = - (width *. 1000.) /. float (Pdfstandard14.textwidth false Pdftext.Helvetica "DEMO") - in - let page' = - let font = - Pdf.Dictionary - [("/Type", Pdf.Name "/Font"); - ("/Subtype", Pdf.Name "/Type1"); - ("/BaseFont", Pdf.Name "/Helvetica")] - in let ops = - [Pdfops.Op_BMC "/CPDFSTAMP"; - Pdfops.Op_cm - (Pdftransform.matrix_of_transform - [Pdftransform.Translate (minx, miny +. height /. 2.)]); - Pdfops.Op_gs "/gs0"; - Pdfops.Op_BT; - Pdfops.Op_Tf (fontname, scalex); - Pdfops.Op_Tj "DEMO"; - Pdfops.Op_ET; - Pdfops.Op_EMC] - in - {(Pdfpage.blankpage Pdfpaper.a4) with - Pdfpage.mediabox = page.Pdfpage.mediabox; - Pdfpage.content = [Pdfops.stream_of_ops ops]; - Pdfpage.resources = - Pdf.Dictionary - [("/Font", Pdf.Dictionary [(fontname, font)]); - ("/ExtGState", Pdf.Dictionary - ["/gs0", - Pdf.Dictionary["/Type", Pdf.Name "/ExtGState"; "/ca", Pdf.Real 0.2]]); - ] - } - in - do_stamp false false true pdf page' page (Pdf.empty ()) (* \section{Superimpose text, page numbers etc.} *) @@ -2397,6 +2198,230 @@ let hflip_pdf ?(fast=false) pdf range = in process_pages (flip_page ~fast transform_op pdf) pdf range +let stamp_shift_of_position sw sh w h p = + let half x = x /. 2. in + match p with + | PosCentre (ox, oy) -> ox -. half sw, oy + | PosLeft (ox, oy) -> ox, oy + | PosRight (ox, oy) -> ox -. sw, oy + | Top o -> half w -. half sw, h -. o -. sh + | TopLeft o -> o, h -. sh -. o + | TopRight o -> w -. sw -. o, h -. sh -. o + | Left o -> o, half h -. half sh + | BottomLeft o -> o, o + | Bottom o -> half w -. half sw, o + | BottomRight o -> w -. sw, o + | Right o -> w -. sw -. o, half h -. half sh + | Diagonal | ReverseDiagonal | Centre -> half w -. half sw, half h -. half sh + +let do_stamp fast position scale_to_fit isover pdf o u opdf = + (* Scale page stamp o to fit page u *) + let sxmin, symin, sxmax, symax = + Pdf.parse_rectangle + (match Pdf.lookup_direct pdf "/CropBox" o.Pdfpage.rest with | Some r -> r | None -> o.Pdfpage.mediabox) + in let txmin, tymin, txmax, tymax = + Pdf.parse_rectangle + (match Pdf.lookup_direct pdf "/CropBox" u.Pdfpage.rest with | Some r -> r | None -> u.Pdfpage.mediabox) + in + let o = + if scale_to_fit then + let xmag = (txmax -. txmin) /. (sxmax -. sxmin) in + let ymag = (tymax -. tymin) /. (symax -. symin) in + let scale = + if xmag < 0.999 && ymag < 0.999 then + if xmag > ymag then xmag else ymag + else if xmag >= 1.001 && ymag >= 1.001 then + if xmag > ymag then ymag else xmag + else if xmag >= 1.001 then ymag + else xmag + in + let dx = txmin +. ((txmax -. txmin) -. (sxmax -. sxmin) *. scale) /. 2. in + let dy = tymin +. ((tymax -. tymin) -. (symax -. symin) *. scale) /. 2. in + let scale_op = + Pdfops.Op_cm + (Pdftransform.matrix_of_transform + [Pdftransform.Translate (dx, dy); + Pdftransform.Scale ((sxmin, symin), scale, scale)]) + in + Pdfpage.prepend_operators pdf [scale_op] ~fast o + else + let sw = sxmax -. sxmin + and sh = symax -. symin + and w = txmax -. txmin + and h = tymax -. tymin in + let dx, dy = stamp_shift_of_position sw sh w h position in + let translate_op = + Pdfops.Op_cm + (Pdftransform.matrix_of_transform [Pdftransform.Translate (dx, dy)]) + in + Pdfpage.prepend_operators pdf [translate_op] ~fast o + in + {u with + Pdfpage.content = + (if isover then ( @ ) else ( @@ )) + [protect_removeme pdf u.Pdfpage.resources u.Pdfpage.content] + [protect_removeme pdf o.Pdfpage.resources o.Pdfpage.content]; + Pdfpage.resources = + combine_pdf_resources pdf u.Pdfpage.resources o.Pdfpage.resources} + +(* Alter bookmark destinations given a hash table of (old page reference + * number, new page reference number) pairings *) +let change_destination t = function + Pdfdest.XYZ (Pdfdest.PageObject p, a, b, c) -> + Pdfdest.XYZ (Pdfdest.PageObject (Hashtbl.find t p), a, b, c) + | Pdfdest.Fit (Pdfdest.PageObject p) -> + Pdfdest.Fit (Pdfdest.PageObject (Hashtbl.find t p)) + | Pdfdest.FitH (Pdfdest.PageObject p, x) -> + Pdfdest.FitH (Pdfdest.PageObject (Hashtbl.find t p), x) + | Pdfdest.FitV (Pdfdest.PageObject p, x) -> + Pdfdest.FitV (Pdfdest.PageObject (Hashtbl.find t p), x) + | Pdfdest.FitR (Pdfdest.PageObject p, a, b, c, d) -> + Pdfdest.FitR (Pdfdest.PageObject (Hashtbl.find t p), a, b, c, d) + | Pdfdest.FitB (Pdfdest.PageObject p) -> + Pdfdest.Fit (Pdfdest.PageObject (Hashtbl.find t p)) + | Pdfdest.FitBH (Pdfdest.PageObject p, x) -> + Pdfdest.FitBH (Pdfdest.PageObject (Hashtbl.find t p), x) + | Pdfdest.FitBV (Pdfdest.PageObject p, x) -> + Pdfdest.FitBV (Pdfdest.PageObject (Hashtbl.find t p), x) + | x -> x + +let change_bookmark t m = + {m with Pdfmarks.target = + try change_destination t m.Pdfmarks.target with Not_found -> m.Pdfmarks.target} + +let stamp position fast scale_to_fit isover range over pdf = + let marks = Pdfmarks.read_bookmarks pdf in + let marks_refnumbers = Pdf.page_reference_numbers pdf in + let pdf = Pdfmarks.remove_bookmarks pdf in + let over = Pdfmarks.remove_bookmarks over in + let pageseqs = ilist 1 (Pdfpage.endpage pdf) in + let over_firstpage_pdf = + match Pdfpage.pages_of_pagetree over with + | [] -> error "empty PDF" + | h::_ -> Pdfpage.change_pages true over [h] + in + let merged = + Pdfmerge.merge_pdfs + ~rotations:[Pdfmerge.DNR; Pdfmerge.DNR] + false false ["a"; "b"] [pdf; over_firstpage_pdf] [pageseqs; [1]] + in + let renamed_pdf = + Pdfpage.change_pages true + merged (Pdfpage.renumber_pages merged (Pdfpage.pages_of_pagetree merged)) + in + let renamed_pages = Pdfpage.pages_of_pagetree renamed_pdf in + let under_pages, over_page = + all_but_last renamed_pages, last renamed_pages + in + let new_pages = + map2 + (fun pageseq under_page -> + do_stamp fast position scale_to_fit isover renamed_pdf + (if mem pageseq range then over_page else + Pdfpage.blankpage Pdfpaper.a4) + under_page over) + pageseqs + under_pages + in + let changed = Pdfpage.change_pages true renamed_pdf new_pages in + let new_refnumbers = Pdf.page_reference_numbers changed in + let changetable = hashtable_of_dictionary (List.combine marks_refnumbers new_refnumbers) in + let new_marks = map (change_bookmark changetable) marks in + Pdfmarks.add_bookmarks new_marks changed + +(* Combine pages from two PDFs. For now, assume equal length. *) + +(* If [over] has more pages than [under], chop the excess. If the converse, pad +[over] to the same length *) +let equalize_pages under over = + let length_under = Pdfpage.endpage under + in let length_over = Pdfpage.endpage over + in + if length_over > length_under then + under, + (Pdfpage.change_pages true over (take (Pdfpage.pages_of_pagetree over) length_under)) + else if length_under > length_over then + under, + Pdfpage.change_pages true + over + (Pdfpage.pages_of_pagetree over @ + (many (Pdfpage.blankpage Pdfpaper.a4) (length_under - length_over))) + else + under, over + +let combine_pages (fast : bool) under over scaletofit swap equalize = + let marks_under = Pdfmarks.read_bookmarks under in + let marks_over = Pdfmarks.read_bookmarks over in + let under, over = if equalize then equalize_pages under over else under, over in + let under_length = Pdfpage.endpage under + in let over_length = Pdfpage.endpage over in + if under_length <> over_length then raise (Pdf.PDFError "combine_pages: not of equal length") else + let pageseqs_under = ilist 1 (Pdfpage.endpage under) + in let pageseqs_over = ilist 1 (Pdfpage.endpage over) in + let merged = + Pdfmerge.merge_pdfs ~rotations: [Pdfmerge.DNR; Pdfmerge.DNR] false false ["a"; "b"] [under; over] [pageseqs_under; pageseqs_over] in + let renamed_pdf = + Pdfpage.change_pages true + merged (Pdfpage.renumber_pages merged (Pdfpage.pages_of_pagetree merged)) + in + let under_pages, over_pages = + cleave (Pdfpage.pages_of_pagetree renamed_pdf) under_length + in + let new_pages = + map2 (fun o u -> do_stamp fast (BottomLeft 0.) scaletofit (not swap) renamed_pdf o u over) over_pages under_pages + in + Pdfmarks.add_bookmarks (marks_under @ marks_over) (Pdfpage.change_pages true renamed_pdf new_pages) + +let nobble_page pdf _ page = + let minx, miny, maxx, maxy = + (* Use cropbox if available *) + Pdf.parse_rectangle + (match Pdf.lookup_direct pdf "/CropBox" page.Pdfpage.rest with + | Some r -> r + | None -> page.Pdfpage.mediabox) + in + let fontdict = + match Pdf.lookup_direct pdf "/Font" page.Pdfpage.resources with + | None -> Pdf.Dictionary [] + | Some d -> d + in + let fontname = Pdf.unique_key "F" fontdict in + let width = maxx -. minx in let height = maxy -. miny in + let scalex = + (width *. 1000.) /. float (Pdfstandard14.textwidth false Pdftext.Helvetica "DEMO") + in + let page' = + let font = + Pdf.Dictionary + [("/Type", Pdf.Name "/Font"); + ("/Subtype", Pdf.Name "/Type1"); + ("/BaseFont", Pdf.Name "/Helvetica")] + in let ops = + [Pdfops.Op_BMC "/CPDFSTAMP"; + Pdfops.Op_cm + (Pdftransform.matrix_of_transform + [Pdftransform.Translate (minx, miny +. height /. 2.)]); + Pdfops.Op_gs "/gs0"; + Pdfops.Op_BT; + Pdfops.Op_Tf (fontname, scalex); + Pdfops.Op_Tj "DEMO"; + Pdfops.Op_ET; + Pdfops.Op_EMC] + in + {(Pdfpage.blankpage Pdfpaper.a4) with + Pdfpage.mediabox = page.Pdfpage.mediabox; + Pdfpage.content = [Pdfops.stream_of_ops ops]; + Pdfpage.resources = + Pdf.Dictionary + [("/Font", Pdf.Dictionary [(fontname, font)]); + ("/ExtGState", Pdf.Dictionary + ["/gs0", + Pdf.Dictionary["/Type", Pdf.Name "/ExtGState"; "/ca", Pdf.Real 0.2]]); + ] + } + in + do_stamp false (BottomLeft 0.) false true pdf page' page (Pdf.empty ()) + (* \section{Set media box} *) let set_mediabox x y w h pdf range = let crop_page _ page = diff --git a/cpdf.mli b/cpdf.mli index 7888e1c..4773280 100644 --- a/cpdf.mli +++ b/cpdf.mli @@ -14,6 +14,23 @@ exception HardError of string (** Two exceptions recommended for use with the library, though currently not raised by any function in this module. Cpdfcommand uses them extensively. *) +(** Possible positions for adding text and other uses. See cpdfmanual.pdf *) +type position = + | PosCentre of float * float + | PosLeft of float * float + | PosRight of float * float + | Top of float + | TopLeft of float + | TopRight of float + | Left of float + | BottomLeft of float + | Bottom of float + | BottomRight of float + | Right of float + | Diagonal + | ReverseDiagonal + | Centre + (** {2 Debug} *) (** Debug: Print out a PDF in readable form to the terminal *) @@ -178,10 +195,10 @@ swapped. If [fast] is true, the PDFs are assumed to be well-formed and no fixes are done. *) val combine_pages : bool -> Pdf.t -> Pdf.t -> bool -> bool -> bool -> Pdf.t -(** [stamp scale_to_fit fast isover range over pdf] stamps the first page of +(** [stamp scale_to_fit position fast isover range over pdf] stamps the first page of [over] over each page of the PDF. The arguments have the same meaning as in [combine_pages]. *) -val stamp : bool -> bool -> bool -> int list -> Pdf.t -> Pdf.t -> Pdf.t +val stamp : position -> bool -> bool -> bool -> int list -> Pdf.t -> Pdf.t -> Pdf.t (** {2 Splitting PDFs} *) @@ -217,22 +234,6 @@ val list_fonts : Pdf.t -> (int * string * string * string * string) list (** Expand the string "now" to a PDF date string, ignoring any other string *) val expand_date : string -> string -(** Possible positions for adding text and other uses. See cpdfmanual.pdf *) -type position = - | PosCentre of float * float - | PosLeft of float * float - | PosRight of float * float - | Top of float - | TopLeft of float - | TopRight of float - | Left of float - | BottomLeft of float - | Bottom of float - | BottomRight of float - | Right of float - | Diagonal - | ReverseDiagonal - | Centre (** Produce a debug string of a [position] *) val string_of_position : position -> string diff --git a/cpdfcommand.ml b/cpdfcommand.ml index 88ff257..3c15870 100644 --- a/cpdfcommand.ml +++ b/cpdfcommand.ml @@ -864,10 +864,13 @@ let setaddbookmarks s = setop (AddBookmarks s) () let setstampon f = - setop (StampOn f) () + setop (StampOn f) (); + (* Due to an earlier bad decision (default position), we have this nasty hack *) + if args.position = Cpdf.TopLeft 100. then args.position <- Cpdf.BottomLeft 0. let setstampunder f = - setop (StampUnder f) () + setop (StampUnder f) (); + if args.position = Cpdf.TopLeft 100. then args.position <- Cpdf.BottomLeft 0. let setstamponmulti f = setop (StampOn f) (); @@ -3099,12 +3102,7 @@ let go () = | Some Split -> begin match args.inputs, args.out with | [(f, ranges, _, _, _)], File output_spec -> - let pdf = get_single_pdf args.op true - (*and filename = - match f with - | InFile n -> n - | _ -> ""*) - in + let pdf = get_single_pdf args.op true in let enc = match args.crypt_method with | "" -> None @@ -3245,7 +3243,6 @@ let go () = begin match args.inputs with | [(k, _, _, _, _) as input] -> let pdf = get_pdf_from_input_kind input args.op k in - (* Convert from string to int *) let topage = try match args.topage with @@ -3344,7 +3341,6 @@ let go () = in let overpdf = if args.uprightstamp then Cpdf.upright ~fast:args.fast (ilist 1 (Pdfpage.endpage overpdf)) overpdf else overpdf in let pdf = get_single_pdf args.op false in - (*let marks = Pdfmarks.read_bookmarks pdf in*) let range = parse_pagespec pdf (get_pagespec ()) in let pdf = if args.ismulti @@ -3352,10 +3348,8 @@ let go () = let overpdf = equalize_pages_extend pdf overpdf in Cpdf.combine_pages args.fast pdf overpdf true false false else - Cpdf.stamp args.fast args.scale_stamp_to_fit true range overpdf pdf + Cpdf.stamp args.position args.fast args.scale_stamp_to_fit true range overpdf pdf in - (*let p = Pdfmarks.add_bookmarks marks pdf in - Pdfwrite.debug_whole_pdf p;*) write_pdf false pdf | Some (StampUnder under) -> let underpdf = @@ -3365,16 +3359,16 @@ let go () = in let underpdf = if args.uprightstamp then Cpdf.upright ~fast:args.fast (ilist 1 (Pdfpage.endpage underpdf)) underpdf else underpdf in let pdf = get_single_pdf args.op false in - (*let marks = Pdfmarks.read_bookmarks pdf in*) let range = parse_pagespec pdf (get_pagespec ()) in let pdf = if args.ismulti then let underpdf = equalize_pages_extend pdf underpdf in Cpdf.combine_pages args.fast pdf underpdf true true false - else Cpdf.stamp args.fast args.scale_stamp_to_fit false range underpdf pdf + else + Cpdf.stamp args.position args.fast args.scale_stamp_to_fit false range underpdf pdf in - write_pdf false pdf (*(Pdfmarks.add_bookmarks marks pdf)*) + write_pdf false pdf | Some (CombinePages over) -> write_pdf false (Cpdf.combine_pages args.fast (get_single_pdf args.op false) (pdfread_pdf_of_file None None over) false false true) diff --git a/cpdfmanual.pdf b/cpdfmanual.pdf index df8aa59255b9f63b714f29c76562d0287d4d902e..ddb7524be62714ebc5681d8ff693cedf0412a509 100644 GIT binary patch delta 23097 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 delta 22808 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 D?@vit diff --git a/cpdfmanual.tex b/cpdfmanual.tex index 4268419..3bef149 100644 --- a/cpdfmanual.tex +++ b/cpdfmanual.tex @@ -6,6 +6,7 @@ % Explain page labels in -page-info % Correct the documentation for -diagonal and -reverse-diagonal % Explain octal escape sequences in meta fields with -raw +% is scale_to_fit in do_stamp documented? \documentclass[a4paper,makeidx]{memoir} \usepackage{palatino} @@ -1160,7 +1161,9 @@ writing to \texttt{out.pdf}. A watermark should go underneath each page: \small\verb!cpdf -stamp-under topsecret.pdf in.pdf -o out.pdf! \end{framed} - \noindent The \texttt{-combine-pages} operation takes two PDF files and stamps each +\noindent The position commands in \Sref{position} can be used to locate the stamp more precisely (they are calculated relative to the crop box of the stamp). Or, preprocess the stamp with \texttt{-shift} first. + + The \texttt{-combine-pages} operation takes two PDF files and stamps each page of one over each page of the other. The length of the output is the same as the length of the ``under'' file. For instance: \begin{framed}