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

