web-dev-qa-db-ja.com

reportlab(python)のdrawStringメソッドを使用して1行に太字と通常のテキストを追加する方法

私はreportlab libを初めて使用し、大学のプロジェクトに同時に取り組んでいることを学んでいます。 wxpythonでデスクトップアプリケーションを作成しました。これにより、データがPDFで保存されます。

PDFに2行追加したい。行が名前と呼ばれるユーザー入力で始まり、次にいくつかの単語、2行目でいくつかの単語、ユーザー名、そして再びいくつかの単語...

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>上記のプログラムでは機能しませんか?

単語は1行に残しておく必要があります。

9
Omkar

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()

または、ParagraphStyleParagraphfrom reportlab.lib.styles import ParagraphStylefrom reportlab.platypus import Paragraph)を見ることができますが、同じ文字列で2つの異なるスタイルを連結できるかどうかはわかりません。

9
jbihan