如何以编程方式替换 PDF 中的图像(最好使用命令行)

Tom*_*mar 6 pdf command-line acrobat

我正在寻找一种方法来替换现有 PDF 文件中的图像(设置为模板)。

在完美的世界中,我可以在命令行上运行一个命令(linux或windows都可以,我不挑剔),但是,如果需要的话,我也可以使用脚本语言甚至完整的程序来实现一些东西这点(我有视觉工作室)。

老实说,我简直不敢相信在某个地方找到这样的例子是多么困难。

我们运行的是带有 Cygwin 的 Windows,并拥有 Acrobat Pro XI 以及最初创建 PDF 文件的 Illustrator CS6。

本质上,我们正在寻找一种有效的方法来替换我们发送到印刷厂的 PDF 文件的图像。

ron*_*ron 0

我成功地使用 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
Run Code Online (Sandbox Code Playgroud)

然后:

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")
Run Code Online (Sandbox Code Playgroud)

现在用 Gimp 进行任何修改,然后加载修改后的内容

r = fitz.Pixmap("6-rgb-mod.jpg")
s = fitz.Pixmap(fitz.Colorspace(fitz.CS_CMYK), r)
Run Code Online (Sandbox Code Playgroud)

现在据说它会像这样简单

page.replace_image(6, pixmap=s)
Run Code Online (Sandbox Code Playgroud)

但也许我有一个旧的 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" ")
Run Code Online (Sandbox Code Playgroud)

最后保存

doc.save("output.pdf", garbage=3, deflate=True)
Run Code Online (Sandbox Code Playgroud)

使用 mutool 检查,旧图像仍然存在,但未使用。因此,如果您想节省空间,这可能不是好的/完整的方法。但如果您想快速替换图像,而保留其他视觉效果(例如打印),那么就可以了。

文档参考: https: //pymupdf.readthedocs.io/en/latest/