如何使用Python的Pymupdf模块为PDF添加背景图并移除中间层
PyMuPDF添加PDF背景图中间层问题解决方案
问题原因
你看到的中间层是原PDF页面自带的白色背景填充对象:使用overlay=False参数把背景图插到内容最底层时,原PDF自带的白色填充层刚好在背景图和文字/矢量内容之间,挡住背景图就形成了所谓的中间层。
另外你现有代码存在冗余逻辑:连续两次调用fitz.open()赋值给doc变量,第一次打开的文件会被直接覆盖,属于无效代码。
修复后代码
import fitz input_file = "3_giberish template.pdf" output_file_path = "带背景输出.pdf" background_img_filename = "background.png" doc = fitz.open(input_file) page = doc.load_page(0) # 低版本PyMuPDF可替换为page.loadPage(0) # 先清理页面原有内容的冗余指令,删除自带背景填充/旧背景图 page.clean_contents() # 可选:如果原PDF背景是嵌入图片,可执行这段删除原有背景图 # for img in page.get_images(full=True): # xref = img[0] # doc._deleteObject(xref) # 获取页面实际尺寸作为背景图坐标,避免硬编码导致拉伸 full_img_rect = page.rect # 插入背景图到最底层 page.insert_image(full_img_rect, filename=background_img_filename, overlay=False) # 将原页面内容回写到最上层,自动保留透明背景 page.show_pdf_page(page.rect, doc, 0, overlay=True) # 保存文件 doc.save(output_file_path, garbage=4, deflate=True, clean=True) doc.close() print("completed")
注意事项
- 需保证PyMuPDF版本 >= 1.19.0,旧版本部分API存在兼容性差异
- 如需处理多页PDF,循环遍历所有页面执行上述操作即可
- 如果插入背景后存在色差,可检查背景图的色彩模式是否为RGB,CMYK模式图片插入PDF可能出现色差
内容的提问来源于stack exchange,提问作者Prabhat
相关产品推荐
相关产品推荐

