Python将html转化为pdf
前言
前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了。但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲。。。
咋么办的?一个比较好的方法是将文章的正文内容转化成pdf,就不要考虑排版的事情了,看起来比较美观,也不会丢失一些关键信息。
python中将html转化为pdf的常用工具是Wkhtmltopdf工具包,在python环境下,pdfkit是这个工具包的封装类。如何使用pdfkit以及如何配置呢?分如下几个步骤。
1、下载wkhtmltopdf安装包,并且安装到电脑上,在系统Path变量中添加wkhtmltopdf的bin路径,以便于pdfkit的调用。
下载地址:https://wkhtmltopdf.org/downloads.html
请根据自己的系统版本,选择合适的安装包。如果没有装C语言库,建议选择Windows下的第二种。

2、在pycharm中安装pdfkit库,过程就不介绍啦,前面讲过类似的内容。
pip install pdfkit
3、在pycharm中安装whtmltopdf库。
pip install wkhtmltopdf
这个和第一步中的安装包是两个东西,请区别开来。
用法简介
对于简单的任务来说,代码很easy,比如:
import pdfkit
pdfkit.from_url('http://baidu.com','out.pdf')
pdfkit.from_file('test.html','out.pdf')
pdfkit.from_string('Hello!','out.pdf')
pdfkit包含的方法很少,主要用的就是这三个,我们简单看一下每个函数的API:
from_ulr()
def from_url(url, output_path, options=None, toc=None, cover=None,
configuration=None, cover_first=False):
"""
Convert file of files from URLs to PDF document
:param url: url可以是某一个url也可以是url的列表,
:param output_path: 输出pdf的路径,如果设置为False意味着返回一个string
Returns: True on success
"""
r = PDFKit(url, 'url', options=options, toc=toc, cover=cover,
configuration=configuration, cover_first=cover_first)
return r.to_pdf(output_path)
from_file()
def from_file(input, output_path, options=None, toc=None, cover=None, css=None,
configuration=None, cover_first=False):
"""
Convert HTML file or files to PDF document
:param input: 输入的内容可以是一个html文件,或者一个路径的list,或者一个类文件对象
:param output_path: 输出pdf的路径,如果设置为False意味着返回一个string
Returns: True on success
"""
r = PDFKit(input, 'file', options=options, toc=toc, cover=cover, css=css,
configuration=configuration, cover_first=cover_first)
return r.to_pdf(output_path)
from_string()
def from_string(input, output_path, options=None, toc=None, cover=None, css=None,
configuration=None, cover_first=False):
#类似的,这里就不介绍了
r = PDFKit(input, 'string', options=options, toc=toc, cover=cover, css=css,
configuration=configuration, cover_first=cover_first)
return r.to_pdf(output_path)
举几个栗子
我们可以传入列表:
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,可以将其读取成一个变量,其实就是一个string变量。
# Use False instead of output path to save pdf to a variable
pdf = pdfkit.from_url('http://google.com', False)
指定pdf的格式
我们可以指定各种选项,就是上面三个方法中的options。
具体的设置可以参考https://wkhtmltopdf.org/usage/wkhtmltopdf.txt 里面的内容。
我们这里只举个栗子:
options = {
'page-size': 'Letter',
'margin-top': '0.75in',
'margin-right': '0.75in',
'margin-bottom': '0.75in',
'margin-left': '0.75in',
'encoding': "UTF-8",
'custom-header' : [
('Accept-Encoding', 'gzip')
]
'cookie': [
('cookie-name1', 'cookie-value1'),
('cookie-name2', 'cookie-value2'),
],
'no-outline': None
}
pdfkit.from_url('http://google.com', 'out.pdf', options=options)
默认的,pdfkit会show出所有的output,如果你不想使用,可以设置为quite:
options = {
'quiet': ''
}
pdfkit.from_url('google.com', 'out.pdf', options=options)
我们还可以传入任何html标签,比如:
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
改进
有了上面的知识之后,我们大可以尝试一下,如果将之前的save_file方法做一些改变,就能够实现我们下载PDF的目标啦。
我们将方法名改成save_to_pdf,并且在get_body方法中直接返回str(div),而不是div.text。代码如下:
def save_to_pdf(url):
'''
根据url,将文章保存到本地
:param url:
:return:
'''
title=get_title(url)
body=get_Body(url)
filename=author+'-'+title+'.pdf'
if '/' in filename:
filename=filename.replace('/','+')
if '\\' in filename:
filename=filename.replace('\\','+')
print(filename)
options = {
'page-size': 'Letter',
'encoding': "UTF-8",
'custom-header': [
('Accept-Encoding', 'gzip')
]
}
#本来直接调用pdfkid的from方法就可以了,但是由于我们的wkhtmltopdf安装包有点问题,一直没法搜到,所以只能用本办法,直接配置了wk的地址
#尴尬了,主要是一直没法下载到最新的wk,只能在网上down了旧版本的。有谁能下到的话发我一份。。。
config=pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
pdfkit.from_string(body,filename,options=options,configuration=config)
print('打印成功!')

哈哈,成功了,下载了这么多pdf,回头慢慢看就可以了。
常见错误:
IOError: No wkhtmltopdf executable found:
python使用pdfkit中,如果使用pdfkit.from_url 或者pdfkit.from_string等,就会出现上述错误。而且如果你使用pip安装了 wkhtmltopdf,还是会出现这个问题:If this file exists please check that this process can read it. Otherwise please install wkhtmltopdf -
因此需要去安装windows版本的wkhtmltopdf
此处进入下载网址
安装完成之后需要在代码中添加以下内容:
path_wk = r'C:\Python27\wkhtmltopdf\bin\wkhtmltopdf.exe' #安装位置 config = pdfkit.configuration(wkhtmltopdf = path_wk) pdfkit.from_url(url, 'taobao.pdf', configuration=config)
IOError: ‘Command Failed’
如果出现这个错误意味着 PDFKit不能处理一个输入。你可以尝试直接在错误信息后面直接运行一个命令来查看是什么导致了这个错误 (某些版本的 wkhtmltopdf会因为段错误导致处理失败
=============================================================================================================================
1.首先,使用谷歌浏览器打开要保存的页面,例如本人打开了学习python的一个网页。

在浏览器右上角,点击“自定义及控制Google Chrome”标签,在弹出的下拉菜单中选择“打印”;或使用快捷键“Crtl+P”调出此菜单。

在弹出的打印设置及预览页面,在页面右侧的“目标打印机”选项处点击“更改”,默认为设置连接的实际打印机。

在弹出的“选择打印机”窗口,在本地目标打印机的管理框里面选择“另存为PDF”选项。

- 之后还可以具体设置打印的细节,如“页码“,”布局“,”纸张尺寸“,”边距“和”选项“的设置。

设置好之后选择”保存“按钮,在弹出的窗口填写好文件名称,就可以保存了。

Python将html转化为pdf的更多相关文章
- 爬虫实战【3】Python-如何将html转化为pdf(PdfKit)
前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...
- 将页面转化为pdf的实现方法
1.实现代码把html转化为pdf主要是使用wkhtmltopdf.exe工具生成,在获取转化的地址,创建一个进程,把地址传递到进程参数中进行调用wkhtmltopdf.exe工具打印 2.代码片段/ ...
- asp.net 将ppt,word转化为pdf实现在线浏览详解
1.首先添加应用:COM里面的Micsosoft Office 12.0 Object Library(VS2013基本都有14.0或者15.0 有的话一样的添加,因为我的没有只有12.0) : 2. ...
- windows环境下 php 将office文件(word/excel/ppt)转化为pdf(转)
将office文件转化为pdf的方法有 1.利用openoffice提供的服务 (比较简单,但是转化的效果不太好) 2.使用office提供的服务 (注:这在windows服务器上,并且服务器上面安装 ...
- 将caj文件转化为pdf文件进行全文下载脚本(ubuntu下亲测有用)
最近ubuntu下caj阅读器,突然崩掉了,而偏偏要准备开题,在网上搜索原因未果,准备放弃时候,突然在网上看到一个脚本,说是很好用,可以在指定页面将caj文件转化为pdf文件,亲测有用,这里直接给出脚 ...
- 图片转化为pdf(转)
方法1: 利用Adobe公司的Adobe Acrobat Professional进行转化.注意,一定是Professional版本的,Reader版本没有这个功能. 首先安装Adobe Acrob ...
- 利用Pandoc将markdown文件转化为pdf
利用Pandoc将markdown文件转化为pdf 准备工作 安装pandoc 安装MiKTeX 将markdown文件转换为pdf 准备工作 安装pandoc Windows下安装pandoc很容易 ...
- 为什么一些公司把dwg文件转化为pdf
是因为dwg文件中可能会涉及到字体问题 这台电脑打开dwg没问题,另一台电脑可能没有相应的字体用autocad打开就会出现乱码,所以先转化为pdf,而pdf有固定格式的作用,能够保证一台电脑打开是什么 ...
- 把文档转化为PDF再用PS处理PDF
最近工作中遇到类似下面这样的一个文档. 文档当前设置的是A4 横版打印,可以明显的看到打印的分界线,这样直接打印出来,是没有下面那行“bbbbbbbbbbbbbbbbbb”的,怎么办?可以通过 页面布 ...
随机推荐
- iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的 ...
- OpenCV——PS图层混合算法(六)
具体的算法原理可以参考: PS图层混合算法之六(差值,溶解, 排除) // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGO ...
- SharePoint 2013 新建网站集图解(绝对菜鸟篇)
前言:接触SharePoint的人可能是越来越多,但是很多人一接触就很迷茫,在技术群里问如何新建网站集,这样一篇图解,帮助新手学习在搭建好SharePoint环境之后,如何创建一个网站集,做一个基本的 ...
- android EventBus详解(三)
post()方法调用流程 我们继续来看EventBus类,的另一个入口方法post() //已省略部分代码 public void post(Object event) { PostingThread ...
- netlink组播的使用
Linux的netlink机制是非常好的Linux内核与应用层进行双向交互数据的方式.其常用的单播方式可以实现内核为服务端,应用层为客户端的通信方式.如果需要实现应用层为服务端,内核为客户端的通信方式 ...
- 页面加载完之前显示Loading
1.第一种方式 HTML <body class="is-loading"> <div class="curtain"> <div ...
- 竞品调研时发现的Android新设计特性
先share两篇技术层面的文章: Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用:http://blog ...
- Python_性能测试
使用pip安装Python扩展库memory_profiler from memory_profiler import profile @profile #修饰器 def isPrime(n): if ...
- laravel5.5 延时队列的使用
队列这个知识相对比较冷门,因为平时的CURD基本用不到这个知识,今天用到了,所以就写个博客记录一下吧. 首先你得清楚要用什么驱动,除了database队列驱动(选择database驱动要php art ...
- [Arxiv1706] Few-Example Object Detection with Model Communication 论文笔记
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Helvetica Neue"; color: #042eee } p. ...