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

Python生成PDF时解决二维码下方文字无法居中的单位不统一问题

问题解决方法

核心问题根源

  • 单位未统一:reportlab默认长度单位为点(pt,1英寸=72pt,1mm≈2.8346pt),你导入的mm常量本身就是毫米转pt的换算系数,无需手动写固定偏移值28.34
  • 文本宽度计算参数错误:stringWidth需要传入文本、字体、字号三个参数才能得到正确的pt单位宽度,你之前调用时缺少参数导致输出数值单位不匹配,才会出现比页面宽度还大的错误结果

具体实现方案

所有长度统一用pt计算,文字居中逻辑为:
文字左上角X坐标 = 二维码左上角X坐标 + (二维码宽度 - 文本宽度) / 2
文字左上角Y坐标 = 二维码左上角Y坐标 - 预留间距 - 字号(可根据显示效果微调)

修正后代码

from reportlab.pdfgen.canvas import Canvas
from reportlab_qrcode import QRCodeImage
from reportlab.pdfbase.pdfmetrics import stringWidth
from reportlab.lib.units import mm
from reportlab.lib.pagesizes import A4

### 参数设置 ##########
qr_x = 180.0  # 二维码左上角X坐标(单位pt)
qr_y = 600.0  # 二维码左上角Y坐标(单位pt)
qr_size_mm = 10  # 二维码边长(单位mm)
font_size = 7
font_name = "Times-Roman"
text_to_be_centralized = 'Some text'
text_qr_gap = 3  # 二维码和文字的垂直间距(单位pt)

# 单位统一转pt
qr_size_pt = qr_size_mm * mm

can = Canvas('multi_pages.pdf', pagesize=A4)
# 绘制二维码
qr2 = QRCodeImage('Some information from original PDF', size=qr_size_pt, fill_color=(1, 0, 0))
qr2.drawOn(can, qr_x, qr_y)

# 计算文本宽度(单位pt,和其他尺寸统一)
can.setFont(font_name, font_size)
text_width_pt = stringWidth(text_to_be_centralized, font_name, font_size)
# 计算居中的文本X坐标
text_x = qr_x + (qr_size_pt - text_width_pt) / 2
text_y = qr_y - text_qr_gap - font_size
# 绘制居中文字
can.drawString(text_x, text_y, text_to_be_centralized)

can.save()

验证说明

  • 此时得到的qr_size_pt、text_width_pt、页面尺寸单位均为pt,可直接用于计算
  • 测试相同宽度的文本时,计算出的text_width_pt会和你输入的参考宽度数值匹配,可直接用于居中逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:00:05