我是reportlab
lib的新手,我正在学习同时从事大学项目。
我在wxpython
中创建了一个桌面应用程序,这样可以将数据保存为PDF格式。
我想在我的pdf中添加2行。哪一行以一个名为name的用户输入开头,然后是一些单词,再在第二行一些单词,用户名再用一些单词......
我尝试使用一些Paragraph
和canvas
方法和类,但我无法获得所需的输出。
所需的输出:
Alex 正在开展大学项目。
reportlab是非常好的lib, Alex 喜欢它。
我的代码:
import os
import reportlab
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.pdfmetrics import registerFontFamily
from reportlab.pdfbase.ttfonts import TTFont
# Registered font family
pdfmetrics.registerFont(TTFont('Vera', 'Vera.ttf'))
pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf'))
pdfmetrics.registerFont(TTFont('VeraIt', 'VeraIt.ttf'))
pdfmetrics.registerFont(TTFont('VeraBI', 'VeraBI.ttf'))
# Registered fontfamily
registerFontFamily('Vera',normal='Vera',bold='VeraBd',italic='VeraIt',boldItalic='VeraBI')
# Output pdf file name.
can = canvas.Canvas("Bold_Trail.pdf", pagesize=A4)
# Setfont for whole pdf.
can.setFont('Vera', 12)
# student name variable.
student_name ="Alex"
# Content.
line1 = " is working on college project."
line2 = "Reportlab is very good lib, "
line3 = " liked it.<br>"
# Joining whole content together.
content = "<strong>" + student_name + "</strong>" + line1
content2 = line2 + "<strong>"+student_name + "</strong>" + line3
# drawString location calculation.
x = 0; y = 8.5 * 72
# First string.
can.drawString(x,y, content)
y = y - 72
# Second String.
can.drawString(x,y, content2)
# Create PDF.
can.save()
除了使用在上述程序中不起作用的XML方法<strong>
或<b>
之外,还有其他方法吗?
单词应该保留在一行上。
答案 0 :(得分:9)
您可以使用setFont
对象的canvas
方法,在需要时将字体设置为Bold
,否则设置为Normal
。
*更新*
为了计算x
的正确值,您可以使用stringWidth
方法,该方法计算给定内容的字符串长度,字体名称和字体大小。您必须从reportlab.pdfbase.pdfmetrics
导入它:
[...]
from reportlab.pdfbase.pdfmetrics import stringWidth
[...]
# student name variable.
student_name = 'Alex'
# Content.
line1 = " is working on college project."
line2 = "Reportlab is very good lib, "
line3 = " liked it"
# drawString location calculation.
x = 0
y = 8.5 * 72
# First string.
can.setFont('Helvetica-Bold', 8)
can.drawString(x, y, student_name)
can.setFont('Helvetica', 8)
textWidth = stringWidth(student_name, 'Helvetica-Bold', 8)
x += textWidth + 1
can.drawString(x, y, line1)
y = y - 72
# Second String.
x = 0
can.setFont('Helvetica', 8)
can.drawString(x, y, line2)
textWidth = stringWidth(line2, 'Helvetica', 8)
x += textWidth + 1
can.setFont('Helvetica-Bold', 8)
can.drawString(x, y, student_name)
textWidth = stringWidth(student_name, 'Helvetica-Bold', 8)
x += textWidth + 1
can.setFont('Helvetica', 8)
can.drawString(x, y, line3)
# Create PDF.
can.save()
或者您可以查看ParagraphStyle
和Paragraph
(from reportlab.lib.styles import ParagraphStyle
,from reportlab.platypus import Paragraph
),但我不确定您是否可以在同一个字符串中连接两种不同的样式
答案 1 :(得分:1)
我找到了一种使用XML标签设置段落文本格式的方法。首先,您需要注册字体系列,然后它才能工作。下面,我下载了一组.ttf文件作为示例并进行了注册,然后XML标记正常工作。
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase.pdfmetrics import registerFontFamily
pdfmetrics.registerFont(TTFont('OpenSansR', 'OpenSans-Regular.ttf'))
pdfmetrics.registerFont(TTFont('OpenSansL', 'OpenSans-Light.ttf'))
pdfmetrics.registerFont(TTFont('OpenSansB', 'OpenSans-Bold.ttf'))
registerFontFamily('OpenSans', normal='OpenSansR', bold='OpenSansB', italic='OpenSansL', boldItalic='OpenSansB')