个性化阅读
专注于IT技术分析

如何在Django中从HTML创建PDF

本文概述

与PHP不同, 没有很多可用的库可以用Python中的HTML创建PDF, 但是并不支持该库。在本文中, 你将学习如何在Django中使用wkhtmltopdf创建PDF。

wkhtmltopdf是一个命令行工具, 可使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。它们完全”无头运行”, 不需要显示或显示服务。

要求

你需要wkhtmltopdf在系统中可用并且在命令提示符下可访问。

  • Windows:你可以在安装区域中下载每种体系结构(x86和x64)的安装程序。尽管你可以稍后在代码中更改wkhtmltopdf可执行文件的路径, 但是建议将wkhtmltopdf用作系统上的环境变量。你可以在本文中阅读如何在Windows中创建环境变量。
  • Debian / Ubuntu:你可以使用以下命令直接在控制台中从wkhtmltopdf安装发行版:
$ sudo apt-get install wkhtmltopdf

警告! debian / ubuntu仓库中的版本功能减少(因为它编译时未添加wkhtmltopdf QT补丁), 例如添加了轮廓, 页眉, 页脚, TOC等。要使用此选项, 应从wkhtmltopdf网站安装静态二进制文件, 或者可以使用此脚本。

在此处访问wkhtmltopdf的主页以获取更多信息。

实现

现在我们的环境中已经有wkhtmltopdf可用, 我们只需要使用它即可!但是, 使用PDFKit可以轻松地在Django中创建PDF, 而不是自己处理控制台命令。 PDFKit是一个Python包装器, 可使用Webkit呈现引擎(wkhtmltopdf)和qt将html转换为pdf, 你可以访问Github中的存储库以获取更多信息。

使用以下命令将PDFKit库包含到django项目中:

$ pip install pdfkit

由于wkhtmltopdf为你完成了艰苦的工作, 因此PDFKit的使用非常简单, 几乎涵盖了所有用例:

  • 从html字符串创建PDF。
  • 从Web网址(外部或项目网址)创建PDF。
#import pdfkit into your class
import pdfkit

# Generate PDF from a web URL (maybe only from your project)
pdfkit.from_url('http://google.com', 'out.pdf')
# Generate PDF from a html file.
pdfkit.from_file('file.html', 'out.pdf')
# Generate PDF from a plain html string.
pdfkit.from_string('Hello!', 'out.pdf')

# Save the PDF in a variable
myPdf = pdfkit.from_url('http://google.com', False)

你基本上可以轻松, 快速地动态生成PDF。

例子

使用Django和PDFKit生成PDF很容易, 请查看以下示例:

将PDF保存在服务器上

要在本地保存PDF, 请使用任何方法并提供将文件保存为第二个参数的路径和文件名。

import pdfkit
from django.http import HttpResponse

def index(request):
    pdf = pdfkit.from_url("http://ourcodeworld.com", "ourcodeworld.pdf")

    return HttpResponse("Everything working good, check out the root of your project to see the generated PDF.")

前面的示例将在Django项目的根目录中创建PDF。

传回PDF作为回应

你可以直接从PDFKit中检索文件, 而无需将其保存在系统中, 只需提供False作为目标参数即可。

你可以使用以下代码段返回PDF作为响应:

import pdfkit
from django.http import HttpResponse

def index(request):
    # Use False instead of output path to save pdf to a variable
    pdf = pdfkit.from_url('http://ourcodeworld.com', False)
    response = HttpResponse(pdf, content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'

    return response

如果使用此功能导航至路线, 浏览器将开始下载由控制器生成的PDF。

从项目路线生成PDF

你可以从你的项目的路线(显然需要注册)生成PDF并使用pdf.from_url方法。

import pdfkit
from django.http import HttpResponse

def template(request):
    # Returns some HTML as response
    return HttpResponse("<h1>Hello World</h1>")

def pdf(request):

    # Create a URL of our project and go to the template route
    projectUrl = request.get_host() + '/template'
    pdf = pdfkit.from_url(projectUrl, False)
    # Generate download
    response = HttpResponse(pdf, content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="ourcodeworld.pdf"'

    return response

pdf输出将是Hello World的文档!作为内容。

注意:或者, 你可以在变量中将模板呈现为html, 然后使用pdfkit.from_string方法, 而不是向项目的端点创建请求。

其他设定

自定义wkhtmltopdf路径

如果要修改wkhtmltopdf所在的路径, 可以使用pdfkit的配置方法进行更改:

config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf'))
pdfkit.from_string("<h1>Hello World</h1>", output_file, configuration=config)

PDF设置

你可以指定所有wkhtmltopdf选项。你可以在选项名称中添加” –”。如果选项没有值, 则对dict值使用None, False或”:

options = {
    'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'no-outline': None
}

pdfkit.from_url('http://google.com', 'out.pdf', options=options)

wkhtmltopdf输出

默认情况下, PDFKit将显示所有wkhtmltopdf输出:

wkhtmltopdf输出

如果你不想要它, 则需要在所用方法的配置中设置静默选项:

options = {
    'quiet': ''
}

pdfkit.from_url('google.com', 'out.pdf', options=options)

基本故障排除

在Python中使用PDFKit时, 有两个已知的常见问题:

IOError-找不到wkhtmltopdf可执行文件

发生此错误的原因是你的系统中没有wkhtmltopdf分发。如果已经安装, 则在控制台中可能无法作为命令使用。打开系统控制台, 并验证wkhtmltopdf命令是否存在。

IOError-命令失败

wkhtmltopdf出了点问题, 无法实现该操作。尝试在控制台中执行plain命令, 并检查任何可能的错误(该网页不存在, 该文件不存在, 等等)。


玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何在Django中从HTML创建PDF

评论 抢沙发

评论前必须登录!