使用Python FPDF库逐字符创建PDF时字符重叠问题如何解决
问题原因
cell()方法参数传参错误:第一个参数为单元格宽度,传0代表单元格占满整行宽度;第二个参数为单元格行高,传入初始值为0的line变量,导致单元格高度为0,写入后光标没有正确纵向偏移。ln参数取值错误:传入ln=2时,每次写入单个字符后光标直接跳到当前单元格下方,不会向右移动预留后续字符位置,叠加行高为0的问题,所有字符全部堆叠在同一坐标位置。- 换行逻辑错误:内层循环遍历同一行字符时不应触发换行,只有整行字符全部写入完成后,才需要移动光标到下一行起始位置。
修复方案
逐字符写入时,先获取单个字符的实际渲染宽度,给每个字符分配对应宽度的单元格,同一行内写入字符时光标保持向右移动,整行写完后手动调整光标到下一行开头即可。
修复后的可运行代码:
from fpdf import FPDF pdf = FPDF('P', 'mm', (100,100)) pdf.add_page() # 加载字体,若ArialBlack.ttf不在脚本同目录需填写完整文件路径 pdf.add_font('ariblk', '', "ArialBlack.ttf", uni=True) font_size = int(50*0.8) pdf.set_font("ariblk", size=font_size) text = [['a','b','c','d','e','w','q'],['f','g','h','i','j','k','l']] print("creating pdf...") # 行高设为字体大小的1.2倍,避免上下行字符粘连 line_height = font_size * 1.2 for line_chars in text: for char in line_chars: r, g, b = 50, 100, 10 pdf.set_text_color(r, g, b) # 计算当前字符的实际渲染宽度 char_width = pdf.get_string_width(char) # 写入单个字符,宽度匹配字符实际尺寸,ln=0表示写完光标移到单元格右侧 pdf.cell(char_width, line_height, txt=char, ln=0) # 同一行所有字符写完后,移动光标到下一行起始位置 pdf.ln(line_height) pdf.output(name = "img/output.pdf", dest='F') print("pdf created!")
补充说明
- 如果需要调整字符间距,可以在计算
char_width时额外加上固定间距值,比如char_width = pdf.get_string_width(char) + 1,单位为mm。 - 如果不需要逐字符控制颜色、字体样式等属性,直接调用
multi_cell()或整行传入cell()写入的运行效率更高,逐字符写入仅适合需要单独控制单个字符样式的场景。
内容的提问来源于stack exchange,提问作者Alora
相关产品推荐
相关产品推荐

