Linux

通過命令行在 PDF 中疊加文本

  • October 16, 2020

以下命令使用 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.pdfusing ps2pdf,然後將其堆疊在原始 pdf 的頂部,使用pdftkor qpdf…)。

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 頁面的左上角……

引用自:https://unix.stackexchange.com/questions/233547