2017-05-18 4 views
2

私はこのサイトの 'tuomastik'によってすばらしいコードを与えられました。しかし、私はそれを編集しようと数時間を費やして、複数のPDF(1つのPDFではなく新しいページからの各レポート)ではなく、1つのPDFに印刷するようにしましたが、HTMLは、立ち往生している。python - jinja2 - すべてのhtmlをpythonから1つのPDFに変換する(複数ではなく)

コードは次のとおりです。

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のループを混乱させると実行できません。

感謝

答えて

1

report_template.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 
+0

は今までどうもありがとうございました!...これは素晴らしいですし、完璧に動作します! – ScoutEU

関連する問題