我正在寻找一种方法来替换现有 PDF 文件中的图像(设置为模板)。
在一个完美的世界中,我可以在命令行上运行一个命令(linux或windows都可以,我不挑剔),但是,如果需要,我也可以使用脚本语言甚至完整的程序来实现一些东西此时(我有视觉工作室)。
老实说,我不敢相信要在某个地方找到这样的例子是多么困难。
我们运行的是带有 Cygwin 的 Windows,并拥有 Acrobat Pro XI 以及最初创建 PDF 文件的 Illustrator CS6。
本质上,我们正在寻找一种有效的方法来替换我们发送到印刷厂的 PDF 文件的图像。
我成功地使用 pymupdf 进行了类似的操作。详细信息(和其他方法)在https://github.com/pymupdf/PyMuPDF/discussions/924#discussioncomment-7249686.
的线程中TLDR(复制了我的评论):
加载文档和页面(取自 JorjMcKie 的评论):
doc = fitz.open("input.pdf")
page = doc[pno] # read the page at page number pno
img_list = page.get_images(full=True) # a list of all images on that page
然后:
p = fitz.Pixmap(doc, 6) # or whatever xref id
q = fitz.Pixmap(fitz.Colorspace(fitz.CS_RGB), p) # can save jpg only in RGB format, this was DeviceCMYK
q.save("6-rgb.jpg")
现在用 Gimp 进行任何修改,然后加载修改后的内容
r = fitz.Pixmap("6-rgb-mod.jpg")
s = fitz.Pixmap(fitz.Colorspace(fitz.CS_CMYK), r)
A现在据称它会像
一样简单page.replace_image(6, pixmap=s)
但也许我有一个较旧的 pymupdf,它在缺少 doc.is_image 时抛出异常(在较新的源中它是 doc.xref_is_image,所以可能已修复),所以我遵循了 Replace_image 的实现:
new_xref = page.insert_image(page.rect, pixmap=s)
doc.xref_copy(new_xref, 6)
last_contents_xref = page.get_contents()[-1]
doc.update_stream(last_contents_xref, b" ")
最后保存
doc.save("output.pdf", garbage=3, deflate=True)
用mutool检查,旧镜像仍然存在,但没有使用。因此,如果您想节省空间,这可能不是好的/完整的方法。但如果您想快速替换图像,保留其他视觉效果(例如打印),那么就可以了。