在 pdf 文件的第一页添加文本

Geo*_*ard 7 pdf text file ghostscript addition

我正在尝试向 pdf 文件添加文本注释(不是注释)。我创建一个date.ps文件,其中包含文本注释:

%! 
/Arial findfont 
30 scalefont 
setfont 
newpath 
10 720 moveto 
(PAID on 5.1.2013) show 
showpage
Run Code Online (Sandbox Code Playgroud)

我启动 shell 命令来$i=name标记 pdf 文件:

%! 
/Arial findfont 
30 scalefont 
setfont 
newpath 
10 720 moveto 
(PAID on 5.1.2013) show 
showpage
Run Code Online (Sandbox Code Playgroud)

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

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

小智 8

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

例如,

cpdf \
    -add-text "PAID on 5.1.2013" \
    -topleft 100 \
    -font "Helvetica" \
    -font-size 30 \
    in.pdf \
    -o out.pdf
Run Code Online (Sandbox Code Playgroud)


tob*_*ora 6

由于cpdf有一个奇怪的商业用途许可证,我试图寻找替代方案。这是一个(您需要安装enscriptps2pdf和(pdftkqpdf))。这个想法只是使用从文本enscript创建 a ,然后将其转换为using ,然后将其堆叠在原始 pdf 之上,使用或...)。.ps.ps.pdfps2pdfpdftkqpdf

pdfk版本

echo "I will be stamped on top of the page" | \
    enscript -B -f Courier-Bold16 -o- | \
    ps2pdf - | \
    pdftk input.pdf stamp - output output.pdf
Run Code Online (Sandbox Code Playgroud)

qpdf版本

如果您希望文本在所有页面上重复:

tmpfile=$(mktemp) && echo "I will be stamped on top of the page" | \
    enscript -B -f Courier-Bold16 -o- | \
    ps2pdf - "$tmpfile" && qpdf input.pdf --overlay "$tmpfile" --repeat=1-z -- output.pdf
Run Code Online (Sandbox Code Playgroud)

如果您只想将其放在第一页上:

tmpfile=$(mktemp) && echo "I will be stamped on top of the page" | \
    enscript -B -f Courier-Bold16 -o- | \
    ps2pdf - "$tmpfile" && qpdf input.pdf --overlay "$tmpfile" -- output.pdf
Run Code Online (Sandbox Code Playgroud)

有关如何设置文本格式的更多选项,请参阅enscript 文档。

注意:mktemp仅用于创建临时文件以提供单行解决方案,因为qpdf不接受来自stdin. rm "$tmpfile"命令完成后删除 tmpfile 。


Ken*_*enS 2

因为您的 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
Run Code Online (Sandbox Code Playgroud)

对我有用。

  • "&lt;&lt;/EndPage {0 eq{1 eq{/Arial findfont 20 scalefont setfont...show} if}{pop} ifelse true} &gt;&gt; setpagedevice" 您需要在 '. ..' 部分。EndPage 在每个页面之后被调用,此代码测试原因代码以查看其“showpage”(即 0)是否为“showpage”(即 0),如果是则测试页数以查看其是否为 1,如果是则运行代码。 (2认同)