使用reportlab该如何实现中文段落换行?
系统前提:
系统环境:
前端Angularjs,后端tornado,数据库sqlite3。
系统介绍:
我有一个要实现套打功能的业务系统,通过针式打印机打印证件。目前思路是通过生成pdf文件来打印,不需要第三方控件,也不挑浏览器,目前支持H5的浏览器都能够直接显示pdf。
self.set_header("Content-Type", "application/pdf")
效果非常好,客户非常认可。
pdf控件使用的是reportlab(点击进入官方网站),免费版没有好看的模板使用,收费版有很多漂亮模板,但是授权费用出奇的昂贵,不过好在套打系统不需要生成什么模板来使用。
遇到问题:
我想实现中文段落自动换行,我的代码没有成功,各位有没有成功案例或者是思路给提供下。
# -*- coding: utf-8 -*-
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm, inch
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.pdfmetrics import stringWidth
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.graphics.barcode import code128
import reportlab.lib.styles
from cStringIO import StringIO
import time
import math
#...
#中文段落自动换行
def creat_wrap_string():
pdfmetrics.registerFont(TTFont('msyh', 'msyh.ttf'))
reportlab.lib.styles.ParagraphStyle.defaults['wordWrap'] = 'CJK'
buffer = StringIO()
# c = canvas.Canvas(buffer)
c = canvas.Canvas('test.pdf')
c.setPageSize((295.14 * mm, 207.26 * mm))
style_sheet = getSampleStyleSheet()
style = style_sheet['BodyText']
style.fontName = 'msyh'
style.fontSize = 11
style.leading = 14
style.firstLineIndent = 22
Pa = Paragraph(
'''
多行文本测试一下。\n
看看效果如何,是否可以自动换行。\n
如果这样也可以的话那么就应该没有问题了\n
程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试 程序测试
'''
, style)
Pa.wrapOn(c, 6 * inch, 8 * inch)
Pa.drawOn(c, 0, 5 * inch)
Pa.drawOn
c.showPage()
c.save()
# response.write()
# pdf = buffer.getvalue()
# buffer.close()
# return pdf
creat_wrap_string()
然而代码并没有很好的换行
生成pdf显示效果如下:
如图所示,段落间并没有自动换行,如果要实现自动换行我该如何操作?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
是不是pdf的换行符不是n导致的呢
我也遇到相同问题,在reportlab表格中中文无法自动换行,请求大神解答。
用<br/>换行
Report Lab使用 Report Lab XML 的一种语言来控制格式,和html有点类似,手动段落换行使用
<br/>
中文还需要设置
style.wordWrap = 'CJK'
让整段中文断句正确,实现自动换行。