【问题标题】:add text on 1st page of a pdf file在 pdf 文件的第一页添加文本
【发布时间】:2013-09-12 16:09:33
【问题描述】:

我正在尝试向 pdf 文件添加文本注释(不是注释)。 我创建了一个包含文本注释的 date.ps 文件: %! /Arial findfont 30 比例字体 设置字体 新路径 10 720 移动到 (2013 年 1 月 5 日支付)显示 展示页面

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

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

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

你能帮帮我吗

【问题讨论】:

    标签: file pdf text add ghostscript


    【解决方案1】:

    您可以使用免费的cpdf command line tools 直接对 PDF 执行此操作:

    例如,

    cpdf -add-text "PAID on 5.1.2013" -topleft 100 -font "Helvetica" -font-size 30 in.pdf -o out.pdf
    

    【讨论】:

    • 我用的是群晖NAS,没有这个命令。我可以安装一个名为 xpdf 3.02-1 的工具包,你认为它有帮助吗?
    • 我在windows下试了一下,这个非常好用,效果很好。问题是我用的NAS没有编译版本,编译知识太差了!
    • nix 包管理器有它的编译版本,你可以用sh <(curl -L https://nixos.org/nix/install) --daemon 安装nix(应该在Linux、MacOS 和Windows WSL 中工作)然后用nix-env -iA nixpkgs.ocamlPackages.cpdf 安装cpdf。
    【解决方案2】:

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

    pdtfk 版本

    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 的输入

    【讨论】:

      【解决方案3】:

      因为您的 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
      

      为我工作。

      【讨论】:

      • 不工作,我得到与 ps 文件相同的结果:%! /Arial findfont 30 scalefont setfont newpath 10 720 moveto (PAYE PAR UBS LE 16.09.2013) 显示
      • 因为它的 under PDF 页面,它执行隐式擦除并填充白色...
      • 也许你可以帮助我更多,你能通过电子邮件联系我吗?当然,如果您向我提出解决方案,我会为您花费的时间付费。
      • "> setpagedevice" 你需要填写您在“...”部分完成的标记操作。 EndPage 在每一页之后被调用,这段代码测试原因码看它是否'showpage'(即0),如果它测试页数看它是否为1,如果是它运行代码。跨度>
      • 非常感谢,这几乎是我要找的。
        但是当我使用例如 2 页的 pdf 时,我得到 1 页空,第 1 页对应于第 1 页pdf,第三个是空的,第四个是用我的文字回应第二个。这是我的 ps 文件的完整内容:> setpagedevice.使用 gs 的 shell 脚本是: cd /volume1/DATA/A_PAYER gs -q -dNOPAUSE -dSAFER -dBATCH -sOutputFile=./OUT.pdf -sDEVICE=pdfwrite -sPAPERSIZE=a4 datex.ps ./IN.pdf跨度>
      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      相关资源
      最近更新 更多