Je voulais avoir un certain espace entre chaque chaîne, je faisais donc une fonction comme ci-dessous et a dessiné la chaîne.

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())

Et puis je reçois ça.

"1 1 1" est "1" et "2 9 9" est "2 9" tandis que "1 9 5 0" ou "2 6 1" sont "1 9 5 0" et "2 6 1" "

Si je viens d'utiliser le cordon comme celui que j'ai commenté ou imprimez chaque lettre dans une boucle pour vous assurer que "1 1" et "2 9 9" y a-t-il.

Est-il possible que ReportLab ne puisse parfois pas tirer des cordes trop près de la prochaine? Seulement parfois ???

0
Kantumrobot 3 juin 2021 à 01:21

1 réponse

Meilleure réponse

text.index renvoie la première occurrence de la chaîne, essayez cela à la place:

for index, moji in enumerate(text):
    c.drawString((x+w*index)*mm, y*mm, moji)
0
Androbin 2 juin 2021 à 22:39