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.

Вернуться на верх