Django, xhtml2pdf не удается добавить в свойства canvas
Я пытаюсь создать несколько столбчатых диаграмм в формате pdf в моем проекте Django
, используя xhtml2pdf
(который я нахожу более простым в использовании, чем ReportLab
, и лучше, чем Weasyprint
). Я могу использовать пример, приведенный в документах xhtml2pdf, используя свои собственные данные и метки, и могу изменить любые из существующих свойств canvas, но не могу добавить никаких новых свойств. Насколько я понимаю, свойства canvas, которые использует xhtml2pdf
, получены из Графики ReportLab, преобразованной в словарь.
Мой HTML-код выглядит так:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vertical bars</title>
</head>
<body>
<canvas type="graph" width="350" height="150">
{
"data": [{{ data1 }}, {{ data2 }}], # <-- Can add data & labels here
"labels": {{ labels }},
"title": {"_text": "Number of Orders by Destination", "x": 290, "y": 155},
"x_title": 290, "y_title": 155,
"type": "verticalbar",
"fillColor" : "#000000", # <-- (added) cannot change color
"x": 150, "y": 50,
"barLabelFormat": "%2.0f",
"barLabels": {"nudge": 7},
"valueAxis": {"valueStep": 40, "valueMin" : 0}, # <-- (added) property ignored
"categoryAxis": {
"strokeColor": "#000000", # <-- changed
"labels": {"angle": 0, "boxAnchor": "n", "dy": -6, "fontName": "Helvetica", "fontSize": 8, "textAnchor": "middle"}
}
}
</canvas>
</body>
</html>
Как я могу добавить свойства на страницу xhtml2pdf
html
? В частности, я хочу изменить графический фон на белый (нет?)
Ответ заключается в использовании trml2pdf
(полученного из ReportLab
библиотеки rml2pdf), а не xhtml2pdf
В моем views.py
У меня есть:
@login_required
def pdf2_countries(request):
from django.template.loader import get_template
from django.template.context import Context
import trml2pdf
countries = Country.objects.all()
data = {'countries':countries}
template = get_template('tracker/rl3.rml')
context = Context(data)
xmlstring = template.render(context.flatten())
pdfstr = trml2pdf.parseString(xmlstring)
response = HttpResponse(pdfstr, content_type="application/pdf")
response.headers["Content-Disposition"] = "attachment; filename=countries.pdf"
return response
и мой rl3.rml
файл шаблона выглядит так:
<!DOCTYPE document SYSTEM "rml.dtd">
<document filename="example_07.pdf">
<template showBoundary="0">
<pageTemplate id="main">
<pageGraphics>
<fill color="midnightblue"/>
<rect x="30" y="790" width="532" height="40" fill="yes" stroke="no"/>
<setFont name="Helvetica-Bold" size="20"/>
<fill color="white"/>
<drawString x="40" y="804">Order Tracking</drawString>
<fill color="black"/>
<setFont name="Helvetica-Bold" size="12"/>
<drawCenteredString x="288" y="40">Page <pageNumber/></drawCenteredString>
</pageGraphics>
<frame id="first" x1="30" y1="60" width="532" height="720"/>
</pageTemplate>
</template>
<stylesheet>
<blockTableStyle id="t1">
<blockFont name="Helvetica-Bold" size="12" start="0,0" stop="3,0"/>
<blockBackground colorName="lightblue" start="0,0" stop="3,0"/>
<blockAlignment value="CENTER" start="0,0" stop="3,0"/>
<blockAlignment value="CENTER" start="0,1" stop="0,-1"/>
<blockTopPadding length="5" start="0,0" stop="3,0"/>
<blockBottomPadding length="10"/>
<lineStyle kind="GRID" colorName="black"/>
</blockTableStyle>
</stylesheet>
<story>
<blockTable style="t1" x="50" y="50" width="532" height="600" colWidths="100,150,260">
<namedString id="LASTPAGENO"><pageNumber/></namedString>
<tr fillColor="lightblue">
<td>Country Code</td>
<td>Country Name</td>
<td>Agent Email</td>
</tr>
{% for country in countries %}
<tr >
<td>{{ country.countrycode }}</td>
<td><para>{{ country.countryname }}</para></td>
<td><para>{{ country.agentemail }}</para></td>
</tr>
{% endfor %}
</blockTable>
</story>
</document>
, который создает простой список стран в формате pdf. Это дает гораздо больше возможностей для настройки PDF-файлов, чем xhtml2pdf
.