You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求用Python 3.11的pikepdf库给PDF票务图片插入用户姓名的示例代码

基于pikepdf+PyMuPDF实现图片PDF门票插入姓名

你的PDF本质是图片格式,没有可编辑的文本层,所以需要在PDF页面上叠加文本来实现姓名插入。下面是结合Flask的完整示例代码:

依赖安装

先安装所需库:

pip install pikepdf pymupdf flask

Flask示例代码

from flask import Flask, request, send_file
import pikepdf
import fitz  # PyMuPDF
import os
import tempfile

app = Flask(__name__)
# 替换为你的原始门票PDF路径
ORIGINAL_TICKET_PATH = "original_ticket.pdf"

def insert_name_to_ticket(original_pdf_path, name, output_pdf_path):
    # 读取原始PDF
    with pikepdf.Pdf.open(original_pdf_path) as pdf:
        # 用PyMuPDF加载PDF,准备添加文本
        doc = fitz.open(original_pdf_path)
        page = doc[0]  # 假设门票仅1页
        
        # 配置文本参数,需根据你的门票调整坐标和样式
        # 坐标原点为页面左下角,x向右递增,y向上递增
        text_font = "helv"  # 如需中文可改为"simhei"(需系统有黑体)
        text_size = 14
        text_color = (0, 0, 0)  # RGB黑色
        text_x = 150  # 替换为姓名位置的x坐标
        text_y = 300  # 替换为姓名位置的y坐标
        
        # 插入姓名文本
        page.insert_text((text_x, text_y), name, fontname=text_font, fontsize=text_size, color=text_color)
        
        # 临时保存修改后的PDF
        temp_path = tempfile.mktemp(suffix=".pdf")
        doc.save(temp_path)
        doc.close()
        
        # 用pikepdf重新保存确保PDF结构合规
        with pikepdf.Pdf.open(temp_path) as modified_pdf:
            modified_pdf.save(output_pdf_path)
        
        os.remove(temp_path)

@app.route("/generate_ticket", methods=["POST"])
def generate_ticket():
    # 获取用户输入的姓名
    user_name = request.form.get("name", "").strip()
    if not user_name:
        return "请输入姓名", 400
    
    # 创建临时输出文件
    with tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) as temp_file:
        output_pdf_path = temp_file.name
    
    try:
        # 插入姓名并生成门票
        insert_name_to_ticket(ORIGINAL_TICKET_PATH, user_name, output_pdf_path)
        # 返回带姓名的门票PDF
        return send_file(output_pdf_path, as_attachment=True, download_name=f"航天展会门票_{user_name}.pdf")
    finally:
        # 清理临时文件
        os.unlink(output_pdf_path)

if __name__ == "__main__":
    app.run(debug=True)

关键注意事项

  • 坐标调整:你需要自行测试text_x和text_y的值,通过多次调整找到门票上姓名的准确放置位置。
  • 中文字体:如果需要显示中文,需确保系统安装了对应字体(如黑体),并修改text_font参数为对应字体名。
  • 临时文件:代码中使用临时文件存储生成的门票,避免磁盘残留,返回给用户后自动删除。

内容的提问来源于stack exchange,提问作者Celeste

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:45:31