pdf - 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 中我想要的位置。但是,有两个问题:
- 我的 126kb PDF 变成了 900kb PDF
- 我的新 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.
我认为这是我的命令错误,而不是缺少任何依赖项,因为它能够使用我的原始命令打开、编辑和保存文件。
解决方案
在 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 之下,情况可能会更糟。
我希望这可以帮助其他希望做类似事情的人。
推荐阅读
- javascript - 想要在选择选项中附加 Ajax 响应数据
- reactjs - 重新排序当前路由组件
- c# - 我如何在不同的应用程序状态下管理我的计时器,我正在使用 MVVM 方法?
- r - 如何在 Shiny Dashboard 的同一选项卡中显示一个下方的图表?
- wordpress - WordPress 中的 TinyMCE 全屏模式和隐藏元素
- angular - Angular:如何使用和共享入口组件,例如用于延迟加载的表单
- reactjs - 导入反应密码强度
- greenplum - 如何在 GreenPlum 上放置计划任务?
- rest - 带有特定 ZIP 内容的 HTTP Accept 标头
- java - Redis 键命令未显示所有键