3

我正在尝试向 pdf 文件添加文本注释(不是注释)。我创建了一个包含文本注释的 date.ps 文件:%! /Arial findfont 30 scalefont setfont newpath 10 720 moveto (PAID on 5.1.2013) 显示页面

我使用 $i=pdf 文件的名称启动 shell 命令以标记: gs -q -dNOPAUSE -dSAFER -dBATCH -sOutputFile=$RFP/$DOMAINE/$NEWNAME -sDEVICE=pdfwrite -sPAPERSIZE=a4 date.ps $一世

这可行,但它会创建一个新的第一页,其中仅包含文本“PAID on 5.1.2013”​​。

我找不到将文本覆盖在原始 pdf 第一页上的技巧。

你能帮我吗?

4

3 回答 3

5

您可以使用免费的cpdf 命令行工具直接对 PDF 执行此操作:

例如,

cpdf -add-text "PAID on 5.1.2013" -topleft 100 -font "Helvetica" -font-size 30 in.pdf -o out.pdf
于 2013-09-12T16:23:16.627 回答
2

由于cpdf有一个奇怪的商业用途许可证,我试图找到一个替代方案。这是一个(您需要安装enscriptps2pdf和(pdftkqpdf))。这个想法只是用来从文本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

于 2020-10-16T08:42:45.610 回答
1

因为您的 PostScript 执行了一个显示页面,所以它会在标记后弹出第一页,所以剩余的内容因此在第二页和后续页面上。如果您不执行 showpage,那么您所做的标记将在第一页上,并且第一个 PDF 页面将绘制在它的“顶部”。

更复杂的代码可以使用 BeginPage 和 EndPage 在页面内容的上方和下方绘制,以及在指定页面上执行此操作等。

[稍后添加]

试试这个:

%!
<< 
/EndPage 
{
  0 eq
  {
    0 eq
    {
      /Arialabold findfont 22 scalefont setfont newpath 250 820 moveto 1 0 0 setrgbcolor (PAYE PAR CCP LE $DATEPMT) show
    } if
    true
  }
  {
    pop false
  } ifelse
} >> setpagedevice

为我工作。

于 2013-09-12T21:00:03.707 回答