ここに私のコードです。私の最初の関数はstyle
の配列を作成するために、/Lib/site-packages/reportlab/lib/styles.py
ソースコードに基づいています。カモノはどのように太字と斜体を「推測」しますか?
def create_styles(p_tuples):
retour = StyleSheet1()
parent = None
for p_name, font_name, font in p_tuples:
# (!) change path if Linux:
ttf_file = "C:/Windows/Fonts/{}.ttf".format(font)
pdfmetrics.registerFont(TTFont(font_name, ttf_file))
if parent is None:
p = ParagraphStyle(name=p_name,
fontName=font_name,
fontSize=10,
leading=12)
retour.add(p)
parent = p
else:
retour.add(ParagraphStyle(name=p_name,
parent=parent,
fontName=font_name,
fontSize=10,
leading=12))
return retour
その後、私は私のインストールされているフォントと私自身の配列を作成:
def render_to_response(self, context, **response_kwargs):
# this is a response for Django, but the question is about styles
response = HttpResponse(content_type='application/pdf; charset=utf-8')
# ! Hint : no filename -> the browser extracts it from the URL!
# -> create URLs like http://pdfreportlab.com/extract/myfilename.pdf
# this is the way to go to have 100% working UTF-8 filenames!
response['Content-Disposition'] = 'attachment; filename=""'
my_styles = self.create_styles([
('ms-regular', 'montserrat-regular',
'Montserrat-Regular'),
('ms-black', 'montserrat-black',
'Montserrat-Black'),
('ms-black-italic', 'montserrat-black-italic',
'Montserrat-BlackItalic'),
('ms-bold', 'montserrat-bold',
'Montserrat-Bold'),
('ms-bold-italic', 'montserrat-bold-italic',
'Montserrat-BoldItalic'),
])
doc = SimpleDocTemplate(response)
elements = []
c = canvas.Canvas(response, pagesize=A4,)
for idx in my_styles.byName:
p = Paragraph("Hello World <i>italic</i> <b>bold</b>",
style=my_styles[idx])
width, height = p.wrapOn(c, A4[0], A4[1])
elements.append(p)
doc.build(elements)
return response
すべてが非常に(を除いて取り組んでいます厄介な事実)、<i></i>
と<b></b>
のタグは無視されます。スタイル内の現在のフォントのみを使用します。
どのようにしてタグを考慮に入れて、最終的にはテキスト自体のタグでスタイルを取得するようにコードを変更できますか?
'(" normal "、" bold "、" italic "、" boldItalic "):#認識されたフォントの変形はすべてのシステムでハードコードされていますか?デファクトスタンダードですか? –
@OlivierPons - 'reportlab.pdfbase.pdfmetrics.registerFontFamily()'関数のハードコーディングされた引数です(署名は 'registerFontFamily(family、normal = None、bold = None、italic = None、boldItalic = None)')。 ) - 上記のコードでは短縮形ですので、ある引数セットから別の引数セットに名前を変換/渡す必要はありません。 – zwer
ハードコードされたこのソリューションを試してみると、http://two.pairlist.net/pipermail/reportlab-users/2010-October/009795.htmlのようになります。私はあなたの解決策が動作しないことを知った(これはバグだと思うので)。 (1)あなたのループから 'normal'を削除し、(2)ループの直前にこの行を追加してください:' registerFont(TTFont(font_family、ttf_path.format(kwargs ['normal'] ))) '(' 'normal''は常にkwargsに渡されると推論します)。これのために3時間。 –