通過命令行在 PDF 中疊加文本
以下命令使用 convert 生成以下圖像的結果,其中包含字母“A”的疊加框疊加在 PDF 上:
轉換 online_gauss.pdf -fill white -undercolor ‘#00000080’
-pointsize 40 -gravity South -annotate +0+5 ‘A’ online_gauss_annot.pdf
但是,convert 會柵格化源。由於我想保留原始 PDF 格式(矢量)以供發布,是否有一種簡單的方法可以通過命令行在單個 PDF 圖像上實現這種類型的註釋?即使在左下角,我也會對這封信感到滿意。
我見過一些使用 Ghostscript、pdftk(stamp)的例子,但它們涉及幾個中間步驟,對於不同大小的 PDF 圖像很難正確處理。
好吧,我想出了一個在精心製作的LaTex文件中使用**TikZ的解決方案。**結果並不完全相同,但我認為它更好:
這需要一個帶有佔位符的tex文件,這些佔位符將被sh腳本的參數替換。
% file: add_legend.tex \documentclass{standalone} \usepackage{graphicx} \usepackage{tikz} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % LaTeX Overlay Generator - Annotated Figures v0.0.1 % Created with (omitted http) ff.cx/latex-overlay-generator/ % If this generator saves you time, consider donating 5,- EUR! :-) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\annotatedFigureBoxCustom{bottom-left}{top-right}{label}{label-position}{box-color}{label-color}{border-color}{text-color} \newcommand*\annotatedFigureBoxCustom[8]{\draw[#5,thick,rounded corners] (#1) rectangle (#2);\node at (#4) [fill=#6,thick,shape=circle,draw=#7,inner sep=4pt,font=\huge\sffamily,text=#8] {\textbf{#3}};} %\annotatedFigureBox{bottom-left}{top-right}{label}{label-position} \newcommand*\annotatedFigureBox[4]{\annotatedFigureBoxCustom{#1}{#2}{#3}{#4}{white}{white}{black}{black}} \newcommand*\annotatedFigureText[4]{\node[draw=none, anchor=south west, text=#2, inner sep=0, text width=#3\linewidth,font=\sffamily] at (#1){#4};} \newenvironment {annotatedFigure}[1]{\centering\begin{tikzpicture} \node[anchor=south west,inner sep=0] (image) at (-0.75,-0.75) { #1};\begin{scope}[x={(image.south east)},y={(image.north west)}]}{\end{scope}\end{tikzpicture}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \begin{annotatedFigure} {\includegraphics[width=1.0\linewidth]{_image_}} \annotatedFigureBox{0,0}{0.000,0.0}{_letter_}{0,0}%bl \end{annotatedFigure} \end{document}
和sh腳本:
#!/bin/sh # Call this script with at least 2 parameters, for example # sh scriptname <image_file> <letter_of_legend> cat add_legend.tex | sed "s/_image_/$1/g" | sed "s/_letter_/$2/g" | pdflatex #rename output to match <letter_of_legend>_<image_file> format mv texput.pdf $2_$1 #clean up rm texput.* exit 0
最後,通過呼叫:
$> ./legend.sh online_gauss.pdf A
在“A_online_gauss.pdf”中繪製的輸出!
對於不想安裝 texlive 發行版的人,您可能更喜歡這裡
cpdf
的解釋。然而,由於有一個奇怪的商業用途許可證,我試圖找到一個替代方案。這是一個(您需要安裝,和(或))。cpdf``enscript``ps2pdf``pdftk``qpdf
這個想法只是用來從文本
enscript
創建 a.ps
,然後將其轉換.ps
為ps2pdf
,然後將其堆疊在原始 pdf 的頂部,使用pdftk
orqpdf
…)。pdf 版本:
echo "I will be stamped on top of the page" | enscript -B -f Courier-Bold16 -o- | ps2pdf - | pdftk input.pdf stamp - output output.pdf
qpdf版本:
如果您希望文本在所有頁面上重複:
tmpfile=$(mktemp) && echo "I will be stamped on top of the page" | enscript -B -f Courier-Bold16 -o- | ps2pdf - "$tmpfile" && qpdf out_merge.pdf --overlay "$tmpfile" --repeat=1-z -- out_oneline.pdf
如果你只想把它放在第一頁:
tmpfile=$(mktemp) && echo "I will be stamped on top of the page" | enscript -B -f Courier-Bold16 -o- | ps2pdf - "$tmpfile" && qpdf out_merge.pdf --overlay "$tmpfile" -- out_oneline.pdf
有關更多選項,請參閱文件。
注意:
mktemp
僅用於創建臨時文件以提供單線解決方案,因為qpdf
不接受來自stdin
不幸的是,我不確定如何設置文本的位置,因為它並不總是在 a4 頁面的左上角……