如何使用PyPDF2将*.png图片插入PDF文件?现有代码需替换水印源为PNG
如何用PyPDF2插入PNG图片到PDF文件
没问题!你现在的代码是用PDF文件作为水印合并到目标PDF里,但要换成PNG图片的话,PyPDF2本身无法直接读取图片格式——得先把图片转换成PDF页面,或者用PyPDF2的新版本API直接将图片添加到PDF页面中。下面给你两种可行的解决方案:
方案1:先将PNG转为单页PDF再合并(兼容旧版PyPDF2)
这种方法需要借助reportlab库先把PNG生成一个单页PDF,再用你熟悉的合并逻辑处理。
首先安装依赖:
pip install reportlab Pillow
然后修改代码如下:
from PyPDF2 import PdfReader, PdfWriter from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter import io input_file = "example.pdf" output_file = "example-drafted.pdf" image_file = "draft.png" # 第一步:把PNG转成单页PDF packet = io.BytesIO() can = canvas.Canvas(packet, pagesize=letter) # 把图片绘制到PDF画布上,这里默认放在页面左上角,可自行调整坐标 can.drawImage(image_file, 0, 0) can.save() # 重置文件指针到开头 packet.seek(0) image_pdf = PdfReader(packet) image_page = image_pdf.pages[0] # 第二步:读取原PDF并合并页面 with open(input_file, "rb") as filehandle_input: pdf = PdfReader(filehandle_input) first_page = pdf.pages[0] # 合并图片页面到原页面(图片会覆盖在原页面上方,若要让原页面在上可调换合并顺序) first_page.merge_page(image_page) # 准备写入输出文件 pdf_writer = PdfWriter() pdf_writer.add_page(first_page) # 若需要保留原PDF的其他页面,循环添加即可 for page_num in range(1, len(pdf.pages)): pdf_writer.add_page(pdf.pages[page_num]) with open(output_file, "wb") as filehandle_output: pdf_writer.write(filehandle_output)
方案2:用新版PyPDF2直接插入图片(推荐)
如果你使用的是PyPDF2 2.0及以上版本,可以直接用PageObject.add_image()方法插入图片,不需要额外生成PDF。
首先确保你的PyPDF2是新版本:
pip install --upgrade PyPDF2
然后修改代码:
from PyPDF2 import PdfReader, PdfWriter from PyPDF2.generic import RectangleObject input_file = "example.pdf" output_file = "example-drafted.pdf" image_file = "draft.png" with open(input_file, "rb") as filehandle_input: pdf = PdfReader(filehandle_input) pdf_writer = PdfWriter() # 获取第一页并插入图片 first_page = pdf.pages[0] # 设置图片的位置和尺寸:参数格式为 [左, 下, 右, 上],PDF坐标以左下角为原点 # 示例将图片放在页面右下角区域,可自行调整数值 image_rect = RectangleObject([500, 100, 600, 200]) first_page.add_image(image_file, rect=image_rect) pdf_writer.add_page(first_page) # 保留原PDF的其他页面 for page_num in range(1, len(pdf.pages)): pdf_writer.add_page(pdf.pages[page_num]) with open(output_file, "wb") as filehandle_output: pdf_writer.write(filehandle_output)
小提示
- 调整图片位置时,记得PDF的坐标系统是以左下角为原点的,你可以根据需求修改坐标数值来控制图片的位置和大小。
- 如果需要让图片呈现水印的透明效果,建议先在图片编辑工具中调整PNG的透明度,再进行插入操作。
内容的提问来源于stack exchange,提问作者Jax.ajay
相关产品推荐
相关产品推荐

