ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

PythonでReportLabでPDF出力

どうやらPythonのPDF生成はReportLabがスタンダードっぽいので使う。
Unicodeでの縦書きが難しかったのでDjangoで表示する方法メモ。


views.py

...
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.platypus import BaseDocTemplate, Table, Spacer, TableStyle, Frame, PageTemplate, Paragraph, Image
from reportlab.lib import pagesizes, colors
from reportlab.lib.styles import ParagraphStyle
...
def create_pdf(request):
if request.method == "POST":
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'inline;'
fontname = "HeiseiKakuGo-W5"
pdfmetrics.registerFont(UnicodeCIDFont(fontname)) #横書き
vencoding = "UniJIS-UCS2-V"
fontnameV = fontname + "-" + vencoding
fontV = UnicodeCIDFont(fontname, isVertical=True)
fontV.name = fontnameV
fontV.fontName = fontnameV
pdfmetrics.registerFont(fontV) #縦書き
doc = BaseDocTemplate(
response,
leftMargin=10,
rightMargin=10,
topMargin=10,
bottomMargin=10,
pagesize = pagesizes.A4[::-1]
) #A4横型
elementList = []
# 色々ParagraphやらTableやらをelementListに追加
frame1 = Frame(x1=doc.leftMargin, y1=doc.height/2 + doc.bottomMargin,
width=doc.width, height=doc.height/2, id="f1", showBoundary=1)
frame2 = Frame(x1=doc.leftMargin, y1=doc.bottomMargin,
width=doc.width, height=doc.height/2, id="f2", showBoundary=1)
page = PageTemplate(id="p1", frames=[frame1, frame2])
doc.addPageTemplates([page])
doc.build(elementList)
return response


まだ良く分からない。


Python クックブック 第2版

Python クックブック 第2版