3

'tuomastik' 在这个网站上给了我一些很棒的代码,并稍微调整了它以适合我。但是,我花了几个小时尝试编辑它,以便打印到一个 PDF 而不是多个(一个 PDF,但每个报告都从一个新页面开始),但是我的 HTML 没有我想要的那么好,而且我我被卡住了。

代码是:

HTML

<html>


<head>
    <style type="text/css">
        html, body {
            width: 500px;
            font-size: 12px;
            background: #fff;
            padding: 0px;
        }
        #my-custom-table {
            width: 500px;
            border: 0;
            margin-top: 20px;
        }
        #my-custom-table td {
            padding: 5px 0px 1px 5px;
            text-align: left;
        }
    </style>
</head>
<body>


<table cellspacing="0" border="0" style="width:500px; border:0; font-size: 14px;">
    <tr>
        <td style="text-align:left;">
            <b><span>Title of the PDF report - Row {{ row_ix + 1 }}</span></b>
        </td>
        <td style="text-align:right;">
            <b><span>{{ date }}</span></b>
        </td>
    </tr>
</table>


<table cellspacing="0" border="0.1" id="my-custom-table">
    {% for variable_name, variable_value in df.iteritems() %}
    {% if loop.index0 == 0 %}
    <tr style="border-top: 1px solid black;
               border-bottom: 1px solid black;
               font-weight: bold;">
        <td>Variable name</td>
        <td>Variable value</td>
    </tr>
    {% else %}
    <tr>
        <td>{{ variable_name }}</td>
        <td>{{ variable_value }}</td>
    </tr>
    {% endif %}
    {% endfor %}
</table>


</body>
</html>

Python

from datetime import date

import jinja2
import pandas as pd
from xhtml2pdf import pisa

df = pd.read_csv('data.csv', encoding='cp1252')

for row_ix, row in df.iterrows():

    html = jinja2.Environment(  # Pandas DataFrame to HTML
        loader=jinja2.FileSystemLoader(searchpath='')).get_template(
        'report_template.html').render(date=date.today().strftime('%d, %b %Y'),
                                       row_ix=row_ix, df=row)

    # Convert HTML to PDF
    with open('report_row_%s.pdf' % (row_ix+1), "w+b") as out_pdf_file_handle:
        pisa.CreatePDF(
            src=html,  # HTML to convert
            dest=out_pdf_file_handle)  # File handle to receive result

有人可以帮忙吗?我知道我应该从 python 文件中删除 for 循环,但不确定如何处理 html 文件。

我讨厌问,但是我已经做了很好的尝试,但是当我弄乱了 html 中的循环时,我无法让它运行。

非常感谢

4

1 回答 1

4

报告模板.html

<html>


<head>
    <style type="text/css">
        html, body {
            width: 500px;
            font-size: 12px;
            background: #fff;
            padding: 0px;
        }
        #my-custom-table {
            width: 500px;
            border: 0;
            margin-top: 20px;
        }
        #my-custom-table td {
            padding: 5px 0px 1px 5px;
            text-align: left;
        }
    </style>
</head>
<body>


{% for row_ix, row in df.iterrows() %}

    <table cellspacing="0" border="0" style="width:500px; border:0; font-size: 14px;">
        <tr>
            <td style="text-align:left;">
                <b><span>Title of the PDF report - Row {{ row_ix + 1 }}</span></b>
            </td>
            <td style="text-align:right;">
                <b><span>{{ date }}</span></b>
            </td>
        </tr>
    </table>

    <table cellspacing="0" border="0.1" id="my-custom-table">
        {% for variable_name, variable_value in row.iteritems() %}
        {% if loop.index0 == 0 %}
        <tr style="border-top: 1px solid black;
                   border-bottom: 1px solid black;
                   font-weight: bold;">
            <td>Variable name</td>
            <td>Variable value</td>
        </tr>
        {% else %}
        <tr>
            <td>{{ variable_name }}</td>
            <td>{{ variable_value }}</td>
        </tr>
        {% endif %}
        {% endfor %}
    </table>

    <!-- Page break (the syntax is for xhtml2pdf) -->
    <pdf:nextpage />

{% endfor %}


</body>
</html>

Python

from datetime import date

import jinja2
import pandas as pd
from xhtml2pdf import pisa

df = pd.DataFrame({
    "Average Introducer Score": [9, 9.1, 9.2],
    "Reviewer Scores": ["Academic: 6, 6, 6", "Something", "Content"],
    "Average Academic Score": [5.7, 5.8, 5.9],
    "Average User Score": [1.2, 1.3, 1.4],
    "Applied for (RC)": [9.2, 9.3, 9.4],
    "Applied for (FEC)": [5.5, 5.6, 5.7],
    "Duration (Months)": [36, 37, 38]})

html = jinja2.Environment(  # Pandas DataFrame to HTML
    loader=jinja2.FileSystemLoader(searchpath='')).get_template(
    'report_template.html').render(date=date.today().strftime('%d, %b %Y'),
                                   df=df)

# Convert HTML to PDF
with open('report.pdf', "w+b") as out_pdf_file_handle:
    pisa.CreatePDF(
        src=html,  # HTML to convert
        dest=out_pdf_file_handle)  # File handle to receive result
于 2017-05-21T21:26:36.333 回答