python - 奇怪的行为...只有一些文本无法在循环中使用 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有时不能将字符串画得太靠近下一个?只有某些时候???
解决方案
text.index
返回字符串中的第一次出现,试试这个:
for index, moji in enumerate(text):
c.drawString((x+w*index)*mm, y*mm, moji)
推荐阅读
- kubernetes - 为什么 pod 仍处于“待处理”状态?
- css - 在primeng评级组件的文本侧放置
- bootstrap-4 - 由于 tild 导入,Material Design bootstrap 4 未编译为 css
- vue.js - 元素 UI 表 - 添加百分比作为宽度
- php - Symfony 调试栏隐藏在模板操作上
- rabbitmq - rabbitmq 服务器磁盘空间警报
- graphql - graphql 访问对象中的项目时遇到问题
- javascript - 从表内的下拉列表中获取选定的值
- uwp - UWP 组合框滚动条可见性
- html - 从 html5 视频播放器隐藏视频下载按钮在 chrome 最新版本中不起作用 - 70.0.3538.110