如何在 reportlab (python) 中使用 drawString 方法在一行中添加粗体和普通文本

How to add bold and normal text in one line using drawString method in reportlab (python)

我是 reportlab lib 的新手,我正在学习它同时从事大学项目。 我在 wxpython 中创建了一个桌面应用程序,结果以 PDF 格式保存数据。

我想在我的 pdf 中添加 2 行。其中行以名为名称的用户输入开始,然后是一些单词,在第二行再次是一些单词,用户名,然后是一些单词...

我尝试使用一些 Paragraphcanvas 方法和类,但无法获得所需的输出。

期望输出:

Alex 正在研究大学项目。

reportlab 是非常好的库,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>在上面的程序中不起作用,还有其他方法吗?

文字应保持在一行。

您可以使用 canvas 对象的 setFont 方法,在需要时将字体设置为 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()

或者您可以查看 ParagraphStyleParagraph (from reportlab.lib.styles import ParagraphStyle, from reportlab.platypus import Paragraph) 但我不确定您是否可以在相同的字符串。

我找到了一种使用 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')