首页 > 解决方案 > 奇怪的行为...只有一些文本无法在循环中使用 reporlab 绘制

问题描述

我想在每个字符串之间留出一定的空间,所以我做了一个如下所示的函数并绘制字符串。

from io import BytesIO
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm
from reportlab.lib.pagesizes import A4, landscape

bytes = BytesIO()
c = canvas.Canvas(bytes, pagesize=landscape(A4))

def map_each(text,x,y,w):
    for moji in text:
        c.drawString((x+w*text.index(moji))*mm,y*mm,str(moji))

fontname="Times-Roman"
p2="299"
p4="1950"
cha="261"
classification="抹"
               
c.setFont(fontname,12)
# c.drawString(58*mm,160*mm,p2)
map_each(p2, 58, 160, 6)
map_each(p4, 94, 160, 6)
map_each(cha, 124, 160, 6)
if classification=="抹":
    syubetsu="11"
elif classification=="車":
    syubetsu=" 3"
map_each(syubetsu,43,190,7)

c.save()

with open("output.pdf", "wb") as f:
    f.write(bytes.getbuffer())

然后我明白了。

“1 1”是“1”,“2 9 9”是“2 9”,而“1 9 5 0”或“2 6 1”是“1 9 5 0”和“2 6 1”就好了

如果我只是像我注释掉的那样使用drawString,或者在循环中打印每个字母以确保“1 1”和“2 9 9”在那里。

有没有可能reportlab有时不能将字符串画得太靠近下一个?只有某些时候???

标签: pythonpython-3.xpdfreportlab

解决方案


text.index返回字符串中的第一次出现,试试这个:

for index, moji in enumerate(text):
    c.drawString((x+w*index)*mm, y*mm, moji)

推荐阅读