2015-12-14 343 views
1

我一直在網上搜索使用pdfkit(python wrapper)實現頁眉和頁腳的人的例子,並且找不到任何例子。
任何人都能夠展示如何使用pdfkit python包裝來實現wkhtmltopdf中的選項的一些例子嗎?pdfkit頁眉和頁腳

+0

如果您認爲答案適合您,那麼您可以將其標記爲已接受的答案。 –

回答

4

我使用它只與標題,但我認爲它將與頁腳相同。

您需要爲標題分開的html文件。

了header.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
</head> 
<body> 

    Code of your header goes here. 

</body> 
</html> 

然後,如果你使用一些後端像Django和希望使用模板,您可以使用它像在Python

import pdfkit 

pdfkit.from_file('path/to/your/file.html', 'out.pdf', { 
    '--header-html': 'path/to/header.html' 
}) 

棘手的部分是,你可以」 t將標題html作爲呈現的字符串傳遞。你需要有一個文件。

這就是我用Django渲染PDF的過程。

import os 
import tempfile 
import pdfkit 

from django.template.loader import render_to_string 


def render_pdf(template, context, output, header_template=None): 
    """ 
    Simple function for easy printing of pdfs from django templates 

    Header template can also be set 
    """ 
    html = render_to_string(template, context) 
    options = { 
     '--load-error-handling': 'skip', 
    } 
    try: 
     if header_template: 
      with tempfile.NamedTemporaryFile(suffix='.html', delete=False) as header_html: 
       options['header-html'] = header_html.name 
       header_html.write(render_to_string(header_template, context).encode('utf-8')) 

     return pdfkit.from_string(html, output, options=options) 
    finally: 
     # Ensure temporary file is deleted after finishing work 
     if header_template: 
      os.remove(options['header-html']) 

在我的例子中,我創建了一個臨時文件,放置渲染的內容。重要的部分是臨時文件需要以.html結尾並手動刪除。

1

提高@V Stoykov答案,因爲它使用,與自定義標題中渲染功能將如下幫我:我使用了'--header-html''--footer-html'符號作爲

import os 
import tempfile 

import pdfkit 
from flask import render_template, make_response 


@app.route('/generate_pdf') 
def render_pdf_custom_header(foo, bar): 
    main_content = render_template('main_pdf.html', foo=foo) 
    options = { 
     '--encoding': "utf-8" 
    } 

    add_pdf_header(options, bar) 
    add_pdf_footer(options) 

    try: 
     pdf = pdfkit.from_string(main_content, False, options=options) 
    finally: 
     os.remove(options['--header-html']) 
     os.remove(options['--footer-html']) 

    response = build_response(pdf) 
    return response 

def add_pdf_header(options, bar): 
    with tempfile.NamedTemporaryFile(suffix='.html', delete=False) as header: 
     options['--header-html'] = header.name 
     header.write(
      render_template('header.html', bar=bar).encode('utf-8') 
     ) 
    return 

def add_pdf_footer(options): 
    # same behaviour as add_pdf_header but without passing any variable 
    return 

def build_response(pdf): 
    response = make_response(pdf) 
    response.headers['Content-Type'] = 'application/pdf' 
    filename = 'pdf-from-html.pdf' 
    response.headers['Content-Disposition'] = ('attachment; filename=' + filename) 
    return response 

公告它匹配wkhtmltopdf選項格式。