我在使ReportLab渲染中文字符时遇到困难。从我查找过的所有内容来看,人们都说它可能是一个字体问题但是我使用了很多不同的字体,而且它似乎根本就没有使用它们。汉字总是以黑色方块出现。下面是我的一些示例代码。
# -*- coding: utf8 -*-
from reportlab.lib.pagesizes import letter
from reportlab.pdfbase.ttfonts import TTFont
from io import BytesIO
pdfmetrics.registerFont(TTFont('Arial', 'arial.ttf', 'UTF-8'))
buffer = BytesIO()
doc = SimpleDocTemplate(buffer,
rightMargin=inch*0.5, # 1/2 Inch
leftMargin=inch*0.5, # 1/2 Inch
bottomMargin=0,
topMargin=inch*0.375, # 3/8 Inch
pagesize=letter)
# Get Styles
styles = getSampleStyleSheet()
# Custom Style
styles.add(ParagraphStyle(name='Address', font='Arial', fontSize=8))
elements = []
elements.append(Paragraph(u'6905\u897f\u963f\u79d1\u8857\uff0c\u5927\u53a6\uff03\u5927', styles['Address']))
doc.build(elements)
# Get the value of the BytesIO buffer and write it to the response.
pdf = buffer.getvalue()
buffer.close()
return pdf
我使用在fonts文件夹中安装的Ubuntu 12.04上找到的arial.ttf字体。我也试过在这台机器上安装了其他字体,即使在数字上都看起来完全相同,除了黑色方块外,没有任何汉字。
即使开头的数字没有正确打印,我是否错误地注册了字体?什么可能导致黑色方块?
答案 0 :(得分:1)
解决了它。在你的ParagraphStyle中,它需要是fontName =“Arial”而不是font =“Arial”,但我确实学到了一些让其在下面以其他方式工作的其他技巧。
styles.add(ParagraphStyle(name='Address', fontName='Arial')
在做了一些挖掘后,我学会了一些我希望在这种情况下帮助别人的事情。当您在段落内添加标签围绕Unicode文本并将其明确设置为字体时,它将起作用。
elements.append(Paragraph(u'<font name="Arial">6905\u897f\u963f\u79d1\u8857\uff0c\u5927\u53a6\uff03\u5927</font>', styles['Address']))
这解决了至少对于具有各种字体的段落的问题。 再次,这段代码将起作用。
答案 1 :(得分:0)
选择支持中文字符的字体。
在Ubuntu中,我选择“AR PL UMing CN”。
我的代码片段:
# -*- coding: utf-8 -*-
...
pdfmetrics.registerFont(TTFont('AR PL UMing CN', 'uming.ttc'))
styles = getSampleStyleSheet()
...
styles.add(ParagraphStyle(name='Chinese', fontName='AR PL UMing CN', fontSize=20))
elements=[]
elements.append(Paragraph("成”, styles['Chinese']))
doc.build(elements)
...
我甚至可以改为中文编辑并直接输入字符。希望这会有所帮助。