Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1528959
  • 博文数量: 164
  • 博客积分: 2993
  • 博客等级: 少校
  • 技术积分: 1718
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 11:42
文章分类

全部博文(164)

文章存档

2014年(1)

2013年(36)

2012年(90)

2011年(37)

分类: Python/Ruby

2011-11-02 14:18:23

 Python_reportlab教程.pdf   

让我们进入中文的处理过程吧。

原本看到 ReportLab 的 test 目录下有一个 test_multibyte_chs.py ,试了试效果不错,就以为中文问题照猫画虎应该没什么问题呀。但等我再仔细深入后,发现问题不那么简单。

问题一:无法使用Paragraph。因示例中使用的是底层的API,因此对于字体要求不高。而使用Paragraph需要知道粗体、斜体、粗斜体这些字体,而示例中并没有这样的处理。

问题二:在解了上面的问题之后,发现中文只有一种字体,实现不了斜体和粗体效果。

现在我已经基本解决了上面的问题,但是无法实现斜体和粗斜体,这个以后再看一看吧。

这种方法使用直接处理TrueType字体的方法,但在测试过程中速度有些慢。但好处是可以使用中文的字体文件,当然需要是ttf格式的文件。这样可以引入更多的字体了。代码如下:

  1. #coding=utf-8
  2. import reportlab.rl_config
  3. reportlab.rl_config.warnOnMissingFontGlyphs = 0
  4. from reportlab.pdfbase import pdfmetrics
  5. from reportlab.pdfbase.ttfonts import TTFont
  6. from reportlab.pdfgen import canvas
  7. pdfmetrics.registerFont(TTFont(’song’, ‘SURSONG.TTF’))
  8. pdfmetrics.registerFont(TTFont(‘hei’, ‘SIMHEI.TTF’))

  9. from reportlab.lib import fonts
  10. fonts.addMapping(’song’, 0, 0, ’song’)
  11. fonts.addMapping(’song’, 0, 1, ’song’)
  12. fonts.addMapping(’song’, 1, 0, ‘hei’)
  13. fonts.addMapping(’song’, 1, 1, ‘hei’)

  14. import copy

  15. from reportlab.platypus import Paragraph, SimpleDocTemplate, PageBreak
  16. from reportlab.lib.styles import getSampleStyleSheet
  17. stylesheet=getSampleStyleSheet()
  18. normalStyle = copy.deepcopy(stylesheet['Normal'])
  19. normalStyle.fontName =’song’
  20. normalStyle.fontSize = 20
  21. story = []
  22. story.append(Paragraph(<b>你好</b>,中文’, normalStyle))
  23. doc = SimpleDocTemplate(‘hello.pdf’)
  24. doc.build(story)

上面的处理可以解决正常和粗体的字形,但斜体还是无法支持,但已经好多了。而且好处是可以使用其它的中文字体比如仿宋了,彩云体了。

阅读(11646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~