This commit is contained in:
John Whitington 2016-11-08 18:15:04 +00:00
parent 1fdd55bf8f
commit f34d72ad10
3 changed files with 66 additions and 11 deletions

View File

@ -1,5 +1,6 @@
Version 2.2 (To come) Version 2.2 (To come)
o Perform artihmetic on dimensions when specifying size or position
o Add simple rectangles to PDF to blank things out o Add simple rectangles to PDF to blank things out
o Stamping operations now preserve annotations o Stamping operations now preserve annotations
o Decryption fully on-demand for speed. o Decryption fully on-demand for speed.

View File

@ -1740,7 +1740,7 @@ and specs =
" Remove text previously added by cpdf"); " Remove text previously added by cpdf");
("-add-rectangle", ("-add-rectangle",
Arg.String setrectangle, Arg.String setrectangle,
""); " Add a rectangle to the page");
("-bates", ("-bates",
Arg.Int setbates, Arg.Int setbates,
" Set the base bates number"); " Set the base bates number");
@ -2041,9 +2041,9 @@ and specs =
("-creator", ("-creator",
Arg.String setcreator, Arg.String setcreator,
" Change the /Creator entry in the /Info dictionary"); " Change the /Creator entry in the /Info dictionary");
("-list-spot-colours", ("-list-spot-colors",
Arg.Unit (setop ListSpotColours), Arg.Unit (setop ListSpotColours),
" List spot colours"); " List spot colors");
("-squeeze", Arg.Unit setsqueeze, " Squeeze"); ("-squeeze", Arg.Unit setsqueeze, " Squeeze");
("-squeeze-log-to", Arg.String setsqueezelogto, " Squeeze log location"); ("-squeeze-log-to", Arg.String setsqueezelogto, " Squeeze log location");
(*These items are undocumented *) (*These items are undocumented *)
@ -3082,9 +3082,61 @@ let extract_fontfile pagenumber fontname pdf =
end end
| _ -> failwith "unsupported or unfound font" | _ -> failwith "unsupported or unfound font"
let addrectangle (w, h) color position relative_to_cropbox underneath range pdf = let addrectangle
fast (w, h) colour outline linewidth opacity position relative_to_cropbox
underneath range pdf
=
let addrectangle_page _ page = let addrectangle_page _ page =
page let resources', unique_extgstatename =
if opacity < 1.0 then
let dict =
match Pdf.lookup_direct pdf "/ExtGState" page.Pdfpage.resources with
| Some d -> d
| None -> Pdf.Dictionary []
in
let unique_extgstatename = Pdf.unique_key "gs" dict in
let dict' =
Pdf.add_dict_entry dict unique_extgstatename
(Pdf.Dictionary [("/ca", Pdf.Real opacity); ("/CA", Pdf.Real opacity)])
in
Pdf.add_dict_entry page.Pdfpage.resources "/ExtGState" dict', Some unique_extgstatename
else
page.Pdfpage.resources, None
in
let mediabox =
if relative_to_cropbox then
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
else
Pdf.parse_rectangle page.Pdfpage.mediabox
in
let x, y, _ =
Cpdf.calculate_position false w mediabox Cpdf.Horizontal position
in
let ops =
[
Pdfops.Op_q;
Pdfops.Op_BMC "/CPDFSTAMP";
(match colour with (r, g, b) -> Pdfops.Op_rg (r, g, b));
(match colour with (r, g, b) -> Pdfops.Op_RG (r, g, b))
]
@
(if outline then [Pdfops.Op_w linewidth] else [])
@
(match unique_extgstatename with None -> [] | Some n -> [Pdfops.Op_gs n])
@
[
Pdfops.Op_re (x, y, w, h);
(if outline then Pdfops.Op_s else Pdfops.Op_f);
Pdfops.Op_EMC;
Pdfops.Op_Q
]
in
let page = {page with Pdfpage.resources = resources'} in
if underneath
then Pdfpage.prepend_operators pdf ops ~fast:fast page
else Pdfpage.postpend_operators pdf ops ~fast:fast page
in in
Cpdf.process_pages addrectangle_page pdf range Cpdf.process_pages addrectangle_page pdf range
@ -3700,8 +3752,9 @@ let go () =
let range = parse_pagespec pdf (get_pagespec ()) in let range = parse_pagespec pdf (get_pagespec ()) in
write_pdf false write_pdf false
(addrectangle (addrectangle
(parse_coordinate pdf args.coord) args.fast (parse_coordinate pdf args.coord)
args.color args.position args.relative_to_cropbox args.underneath range pdf) args.color args.outline args.linewidth args.opacity args.position
args.relative_to_cropbox args.underneath range pdf)
| Some (AddBookmarks file) -> | Some (AddBookmarks file) ->
write_pdf false write_pdf false
(Cpdf.add_bookmarks true (Pdfio.input_of_channel (open_in_bin file)) (Cpdf.add_bookmarks true (Pdfio.input_of_channel (open_in_bin file))

View File

@ -1,3 +1,4 @@
%FIXME: Document that -upright also shifts the page to 0,0
\documentclass{book} \documentclass{book}
\usepackage{palatino} \usepackage{palatino}
\usepackage{microtype} \usepackage{microtype}
@ -2124,7 +2125,7 @@ recommended when file size is the sole consideration.
\noindent\verb!cpdf -remove-id in.pdf -o out.pdf! \noindent\verb!cpdf -remove-id in.pdf -o out.pdf!
\vspace{1.5mm} \vspace{1.5mm}
\noindent\verb!cpdf -list-spot-colours in.pdf! \noindent\verb!cpdf -list-spot-colors in.pdf!
\vspace{1.5mm} \vspace{1.5mm}
\noindent\verb!cpdf -remove-dict-entry in.pdf -o out.pdf! \noindent\verb!cpdf -remove-dict-entry in.pdf -o out.pdf!
@ -2235,13 +2236,13 @@ You cannot use \texttt{-recrypt} with \texttt{-remove-id}.
\section{List Spot Colours} \section{List Spot Colours}
This operation lists the name of any ``separation'' colour space in the given PDF file. This operation lists the name of any ``separation'' color space in the given PDF file.
\begin{framed} \begin{framed}
\small\noindent\verb!cpdf -list-spot-colours in.pdf! \small\noindent\verb!cpdf -list-spot-colors in.pdf!
\vspace{2.5mm} \vspace{2.5mm}
\noindent List the spot colours, one per line in \texttt{in.pdf}, writing to \texttt{stdout}. \noindent List the spot colors, one per line in \texttt{in.pdf}, writing to \texttt{stdout}.
\end{framed} \end{framed}
\section{Removing Dictionary Entries} \section{Removing Dictionary Entries}