imageMagick:如何在 pdf 的一页上绘图但保留整个 pdf?

imageMagick: How do I draw on one page of a pdf but keep the whole pdf?

我在 Lucee 5.3.7.47 上有一个网络应用 运行。不幸的是,cfPDF 在此版本中不是特别稳定,因此我决定尝试使用 ImageMagick 来处理我的 PDF 功能,这实际上相当于向 pdf 文件添加文本和图像。

我有一个 5 页的 PDF 用于测试。我正在尝试使用此命令向该 pdf 的第 5 页添加一些文本:

magick.exe -density 300 "c:\test.pdf[4]" -pointsize 12 -draw "text 25,425 'Test text'" -draw "text 362,425 'Test text 2'" c:\test_final.pdf

这对我来说几乎是完美的,因为文本正好出现在 test_final.pdf 中我想要的位置。但是,有两个问题:

  1. 我的 126kb PDF 变成了 900kb PDF
  2. 我的新 pdf 只有一页:原版的第 5 页

我认为问题 1 是因为 ImageMagick 无法在不对所有文本进行栅格化的情况下在 pdf 上绘图,从而强制将整个 PDF 本质上保存为图像。这是非常不受欢迎的,但我可以接受它,除非在 IM 中有更好的方法。

问题 2 显然是一个交易破坏者。我需要原始 PDF 的所有页面都保持完整,但我只想在一个特定页面上绘制文本。我该怎么做?

删除 pdf 名称后的页面标识符会生成一个 5 页的 pdf 文件,但我的文字被绘制在每一页上。

我想也许在第五页之前指定 pdf 的其他页面会导致追加操作,但是使用这个命令我仍然看到在每一页上绘制的文本:

magick.exe -density 300 "c:\test.pdf[0-3]" "c:\test.pdf[4]" -pointsize 12 -draw "text 25,425 'Test text'" -draw "text 362,425 'Test text 2'" c:\test_final.pdf

编辑

根据评论,我试图查找如何进行括号处理。它让我找到了一个要求类似 here, with a solution based off the docs here.

的人

我尝试使用 magick.exe:

想出一个类似的命令
-density 300 -compress ZIP "c:\test.pdf[0-3]" \( -clone 4 -pointsize 12 -draw "text 25,425 'Test text'" -draw "text 362,425 'Test text 2'" \) -delete 4 -insert 4 "c:\test_final.pdf"

找到压缩选项有助于在添加到原始命令时显着减小文件大小。然而,这个新命令返回:

magick.exe: unable to open image '\(': No such file or directory @ error/blob.c/OpenBlob/3537.
magick.exe: no decode delegate for this image format `' @ error/constitute.c/ReadImage/572.

我认为这是我的命令错误,而不是缺少任何依赖项,因为它能够使用我的原始命令打开、编辑和保存文件。

在 fmw42 的指导下,我能够制定一个有效的 IM 命令来完成我想要完成的事情(添加换行符以提高可读性):

 -density 300 -compress ZIP "c:\test.pdf[0-3]"
 ( "c:\test.pdf[4]" -font Segoe-Script -pointsize 12 -draw "text 161,1615 'Test Text 1'"
 -font Arial -draw "text 1712,1619 'Test Text 2'" )
 "c:\test_final.pdf"

根据我的理解,对该命令的作用进行一些描述:

  • -density 300设置dpi为300;乘以以英寸为单位的 pdf 页面大小得到该页面的分辨率
  • -压缩 ZIP 通过无损压缩每一页的图像使生成的 pdf 更小
  • "c:\test.pdf[0-3]" 告诉 IM 从使用原始 pdf 的第 1-4 页开始
  • parens 命令是单独处理的,其中的所有内容仅发生在其中指定的页面(在本例中为第 5 页)
    • "c:\test.pdf[4]" 表示我们正在使用原始 pdf 的第 5 页并使用它。
    • -font Segoe-Script -pointsize 12 设置下一个命令的字体细节
    • -draw "text 161,1615 'Test Text 1'" 在坐标 161、1615 处写入文本 'Test Text 1',我使用页面大小和密度如上所述。
    • -font Arial 允许我更改第二段文本的字体中间命令
    • -draw "text 1712,1619 'Test Text 2'" 在这个页面上写了一些更多的文字,这次使用不同的字体。
  • "c:\test_final.pdf" 告诉 IM,在从第一部分获取第 1-4 页并从括号中添加第 5 页后,它应该创建输出文件 test_final.pdf

这对我来说不是一个完美的解决方案。尽管 zip 压缩大大减小了输出文件的大小,但所有页面仍然是光栅化的。这导致文件大小增加:126kb > 831kb。不幸的是,我不认为这可以通过 IM 得到帮助,并且考虑到我们仍然低于 MB,情况可能会更糟。

我希望这对希望做类似事情的其他人有所帮助。