python pdfkit页眉和页脚

u91tlkcl  于 2023-01-08  发布在  Python
关注(0)|答案(5)|浏览(319)

我一直在网上搜索人们使用pdfkit(python Package 器)实现页眉和页脚的例子,但没有找到任何例子。
有谁能够展示一些如何使用pdfkit python Package 器实现wkhtmltopdf中的选项的示例吗?

ddarikpa

ddarikpa1#

我只使用它与标题,但我认为它将工作与页脚相同。
你需要有单独的html文件的标题。
header.html

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

    Code of your header goes here.

</body>
</html>

然后可以在Python中这样使用它

import pdfkit

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

如果你使用Django这样的后端,并且想使用模板,那么棘手的是你不能将头部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结尾,并且需要手动删除。

5lhxktic

5lhxktic2#

改进@V Stoykov答案,因为它帮助我使用FlaskFlask中带有自定义标题的渲染函数如下所示:

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

注意,我使用了'--header-html''--footer-html'表示法,因为它与wkhtmltopdf选项格式匹配。

vd2z7a6w

vd2z7a6w3#

options = {
'page-size': 'Letter',
'margin-top': '0.9in',
'margin-right': '0.9in',
'margin-bottom': '0.9in',
'margin-left': '0.9in',
'encoding': "UTF-8",
'header-center': 'YOUR HEADER',
'custom-header' : [
    ('Accept-Encoding', 'gzip')
],
'no-outline':None
}

您可以添加标头,这是header-center的值中所需的

polkgigr

polkgigr4#

这个问题和它的答案是相当古老的,对我不起作用。
下载版本:$wkhtmltopdf--版本
wkhtmltopdf 0.12.6(已修补qt)
Python 3.8
对于wkhtmltopdf,header-htmlfooter-html只能是URI,例如html url或文件路径,不能是字符串。因此,想法是将每个html文件保存在云上或在本地创建一个临时文件作为页脚和页眉以供参考。
请求:
1.含量为urlhtml
1.标头为html urlhtml string
1.页脚为html urlhtml string
示例:

import logging
import os
import tempfile
import pdfkit
from flask import Flask, Response, make_response
from flask_restx import Resource, Api, fields

Request = api.model('Request', {
    'url': fields.String(
        required=False,
        description='url',
        example='https://www.w3schools.com/html/html5_svg.asp',
    ),
    'html': fields.String(
        required=False,
        description='content html string',
        example=example_content_html
    ),
    'header_html': fields.String(
        required=False,
        description='pdf header html string',
        example=example_header_html
    ),
    'footer_html': fields.String(
        required=False,
        description='pdf footer html string',
        example=example_footer_html
    ),
})
@api.route("/convert_html_to_pdf", endpoint = 'html2pdf')
@api.representation('application/octet-stream')
class PdfConverter(Resource):
    @api.doc(body=Request)
    def post(self):
        logging.info(request.json)
        url = request.json.get('url')
        html = request.json.get('html')
        header_html = request.json.get('header_html')
        footer_html = request.json.get('footer_html')
        header_uri = 'https://xxxxx/header.html' # default header
        footer_uri = 'https://xxxxx/footer.html' # default footer

        if header_html:
            fph = tempfile.NamedTemporaryFile(suffix='.html')
            fph.write(header_html.encode('utf-8'))
            fph.flush()
            header_uri = fph.name

        if footer_html:
            fpf = tempfile.NamedTemporaryFile(suffix='.html')
            fpf.write(footer_html.encode('utf-8'))
            fpf.flush()
            footer_uri = fpf.name

        options = {
          'page-size': 'A4',
          'margin-top': '32mm',
          'header-spacing': 6,
          'footer-spacing': 6,
          'header-html': header_uri,
          'footer-html': footer_uri,
          'margin-right': '0',
          'margin-bottom': '16mm',
          'margin-left': '0',
          'encoding': "UTF-8",
          'cookie': [
            ('cookie-empty-value', '""'),
            ('cookie-name1', 'cookie-value1'),
            ('cookie-name2', 'cookie-value2'),
          ],
          'no-outline': None
        }
        logging.info(options)

        if url:
            # api.payload['requestedBlobUrl'] = url
            # return api.payload
            pdf = pdfkit.from_url(url, options=options)
        else:
            pdf = pdfkit.from_string(html, options=options)

        if header_html:
            fph.close()
        if footer_html:
            fpf.close() # close will delete the temp file

        response = make_response(pdf)
        response.headers['Content-Type'] = 'application/pdf'
        response.headers['Content-Disposition'] = 'attachment;filename=report.pdf'

        return response
lc8prwob

lc8prwob5#

Python pdfkit wrapper只支持html文件作为页眉和页脚,为了能够支持string,你所需要做的就是生成一个临时文件,并在关闭时删除它,下面是我的代码示例。
使用带有delete=True和suffix='.html'参数的临时文件将在temp.close()上生成可删除文件

import tempfile

temp = tempfile.NamedTemporaryFile(delete=True,suffix='.html')
with open(temp.name, 'w') as f:
  f.write("""
          <!DOCTYPE html>
          <html>
          <head>
              <meta charset="UTF-8">
          </head>
          <body>

              Code of your header goes here.

          </body>
          </html>
          """)
options = {
    'page-size': 'A4',
    'margin-top': '1in',
    'margin-bottom': '0.75in',
    'margin-right': '0.75in',
    'margin-left': '0.75in',
    'encoding': "UTF-8",
    'header-html': temp.name,
    'footer-center': "Page [page] of [topage]",
    'footer-font-size': "9",
     'custom-header': [
        ('Accept-Encoding', 'gzip')
      ],
     'enable-local-file-access': False,
     'no-outline': None
}
pdf = pdfkit.from_string(html_string, options=options)
temp.close()

相关问题