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 相关文章推荐
Python中列表、字典、元组、集合数据结构整理
Nov 20 Python
python WindowsError的错误代码详解
Jul 23 Python
Python3实现发送QQ邮件功能(html)
Dec 15 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 Python
python查看模块安装位置的方法
Oct 16 Python
python生成九宫格图片
Nov 19 Python
python查询文件夹下excel的sheet名代码实例
Apr 02 Python
python实现证件照换底功能
Aug 20 Python
python列表的逆序遍历实现
Apr 20 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 Python
python中的sys模块和os模块
Mar 20 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
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
一段实时更新的时间代码
2006/07/07 Javascript
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
Python中的列表知识点汇总
2015/04/14 Python
Python中的ctime()方法使用教程
2015/05/22 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
详解python tcp编程
2020/08/24 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
python 如何对logging日志封装
2020/12/02 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
荷兰本土平价百货:HEMA
2017/10/23 全球购物
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
太太口服液广告词
2014/03/20 职场文书
个人求职信范文
2014/05/24 职场文书
投标承诺函范文
2015/01/21 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android