首页 > 解决方案 > imageMagick:如何在 pdf 的一页上绘图但保留整个 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

编辑

根据评论,我试图查找如何进行括号处理。它使我找到有人在这里寻求类似的东西,并提供基于此处文档的解决方案。

我尝试使用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.

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

标签: pdfimagemagick

解决方案


在 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 页面大小(以英寸为单位)得出该页面的分辨率
  • -compress 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 之下,情况可能会更糟。

我希望这可以帮助其他希望做类似事情的人。


推荐阅读