Python实现将HTML转成PDF的方法分析


Posted in Python onMay 04, 2019

本文实例讲述了Python实现将HTML转成PDF的方法。分享给大家供大家参考,具体如下:

主要使用的是wkhtmltopdf的Python封装——pdfkit

安装

1. Install python-pdfkit:

$ pip install pdfkit

2. Install wkhtmltopdf:

  • Debian/Ubuntu:
$ sudo apt-get install wkhtmltopdf
  • Redhat/CentOS
sudo yum intsall wkhtmltopdf
  • MacOS
brew install Caskroom/cask/wkhtmltopdf

使用

一个简单的例子:

import pdfkit
pdfkit.from_url('http://google.com', 'out.pdf')
pdfkit.from_file('test.html', 'out.pdf')
pdfkit.from_string('Hello!', 'out.pdf')

你也可以传递一个url或者文件名列表:

pdfkit.from_url(['google.com', 'yandex.ru', 'engadget.com'], 'out.pdf')
pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')

也可以传递一个打开的文件:

with open('file.html') as f:
  pdfkit.from_file(f, 'out.pdf')

如果你想对生成的PDF作进一步处理, 你可以将其读取到一个变量中:

# 设置输出文件为False,将结果赋给一个变量
pdf = pdfkit.from_url('http://google.com', False)

你可以制定所有的 wkhtmltopdf 选项 <http://wkhtmltopdf.org/usage/wkhtmltopdf.txt>. 你可以移除选项名字前面的 '--' .如果选项没有值, 使用None, Falseor * 作为字典值:

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)

默认情况下, PDFKit 将会显示所有的 wkhtmltopdf 输出. 如果你不想看到这些信息,你需要传递一个 quiet 选项:

options = {
    'quiet': ''
    }
  pdfkit.from_url('google.com', 'out.pdf', options=options)

由于wkhtmltopdf的命令语法 , TOC 和 Cover 选项必须分开指定:

toc = {
    'xsl-style-sheet': 'toc.xsl'
  }
  cover = 'cover.html'
  pdfkit.from_file('file.html', options=options, toc=toc, cover=cover)

当你转换文件、或字符串的时候,你可以通过css选项指定扩展的 CSS 文件。

# 单个 CSS 文件
  css = 'example.css'
  pdfkit.from_file('file.html', options=options, css=css)
  # Multiple CSS files
  css = ['example.css', 'example2.css']
  pdfkit.from_file('file.html', options=options, css=css)

你也可以通过你的HTML中的meta tags传递任意选项:

body = """
    <html>
     <head>
      <meta name="pdfkit-page-size" content="Legal"/>
      <meta name="pdfkit-orientation" content="Landscape"/>
     </head>
     Hello World!
     </html>
    """
  pdfkit.from_string(body, 'out.pdf') #with --page-size=Legal and --orientation=Landscape

配置

每个API调用都有一个可选的参数。这应该是pdfkit.configuration()API 调用的一个实例. 采用configuration 选项作为初始化参数。可用的选项有:

  • wkhtmltopdf ——wkhtmltopdf二进制文件所在的位置。默认情况下pdfkit 会尝试使用which (在类UNIX系统中) 或 where (在Windows系统中)来判断.
  • meta_tag_prefix -- pdfkit的前缀指定 meta tags(元标签) - 默认情况是pdfkit-

示例 :针对wkhtmltopdf不在系统路径中(不在$PATH里面):

config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf'))
pdfkit.from_string(html_string, output_file, configuration=config)

问题

  • IOError: 'No wkhtmltopdf executable found':

确保 wkhtmltopdf 在你的系统路径中($PATH), 会通过 configuration进行了配置 (详情看上文描述)。 在Windows系统中使用where wkhtmltopdf命令 或 在 linux系统中使用 which wkhtmltopdf 会返回 wkhtmltopdf二进制可执行文件所在的确切位置.

  • IOError: 'Command Failed'

如果出现这个错误意味着 PDFKit不能处理一个输入。你可以尝试直接在错误信息后面直接运行一个命令来查看是什么导致了这个错误 (某些版本的 wkhtmltopdf会因为段错误导致处理失败)

  • 正常生成,但是出现中文乱码

确保两项:

1)、你的系统中有中文字体

2)、在html中加入<meta charset="UTF-8">

下面是我随便写的一个HTML表格:

<html>
<head><meta charset="UTF-8"></head>
<body>
<table width="400" border="1">
 <tr>
 <th align="left">Item....</th>
 <th align="right">1</th>
 </tr>
 <tr>
 <td align="left">衣服</td>
 <td align="right">$241.10</td>
 </tr>
 <tr>
 <td align="left">化妆品</td>
 <td align="right">$30.00</td>
 </tr>
 <tr>
 <td align="left">食物</td>
 <td align="right">$730.40</td>
 </tr>
 <tr>
 <th align="left">tOTAL</th>
 <th align="right">$1001.50</th>
 </tr>
</table>
</body>
</html>

下面是生成的PDF截图

Python实现将HTML转成PDF的方法分析

另:https://pdfcrowd.com/#convert_by_input

更多Python相关内容感兴趣的读者可查看本站专题:《Python文件与目录操作技巧汇总》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
Python多线程实例教程
Sep 06 Python
用Python编写一个国际象棋AI程序
Nov 28 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
python爬取淘宝商品详情页数据
Feb 23 Python
图解Python变量与赋值
Apr 03 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
python读取txt文件中特定位置字符的方法
Dec 24 Python
python如何制作缩略图
Apr 30 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
Python第三方库face_recognition在windows上的安装过程
May 03 #Python
Python人脸识别第三方库face_recognition接口说明文档
May 03 #Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 #Python
利用python将图片版PDF转文字版PDF
May 03 #Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 #Python
Python Flask框架模板操作实例分析
May 03 #Python
Python Flask框架扩展操作示例
May 03 #Python
You might like
Protoss兵种对照表
2020/03/14 星际争霸
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHP反射学习入门示例
2019/06/14 PHP
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
如何在Python中编写并发程序
2016/02/27 Python
python 调用有道api接口的方法
2019/01/03 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
应届毕业生个人自我评价
2013/09/20 职场文书
淘宝活动总结范文
2014/06/26 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle