使用reportlab该如何实现中文段落换行?

系统前提:

  1. 系统环境:

    前端Angularjs,后端tornado,数据库sqlite3。
  2. 系统介绍:

    我有一个要实现套打功能的业务系统,通过针式打印机打印证件。目前思路是通过生成pdf文件来打印,不需要第三方控件,也不挑浏览器,目前支持H5的浏览器都能够直接显示pdf。
    self.set_header("Content-Type", "application/pdf")

    效果非常好,客户非常认可。

  3. 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显示效果如下:

生成的pdf

如图所示,段落间并没有自动换行,如果要实现自动换行我该如何操作?

阅读 12.5k
4 个回答

是不是pdf的换行符不是n导致的呢

新手上路,请多包涵

我也遇到相同问题,在reportlab表格中中文无法自动换行,请求大神解答。

新手上路,请多包涵

用<br/>换行

新手上路,请多包涵

Report Lab使用 Report Lab XML 的一种语言来控制格式,和html有点类似,手动段落换行使用 <br/>

这是一段文字<br/>
这是另外一段<br/>

中文还需要设置 style.wordWrap = 'CJK' 让整段中文断句正确,实现自动换行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏