求用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
相关产品推荐
相关产品推荐

