用Python将HTML转为PDF。
时间:2022-07-26
本文章向大家介绍用Python将HTML转为PDF。,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
上期提到了如何获取公众号文章信息,这回就说下怎么将网页转为PDF,方便平常学习。
然后扩散一下之前一个比赛的结果(华章计算机抖音大赛)。
顺便谈谈自己对今后送书的一个想法。
另外之前的送书活动,有中奖的读者没有联系我,所以这回一并送出。
明天还会送两本书,大家也可以关注一下。
/ 01 / HTML转PDF
主要用到的库有pdfkit及wkhtmltopdf。
安装我就不说了,网上也是一堆教程,通过下面的代码也能略知一二。
需要注意的点就是,把网页转PDF的时候,需要将网页的图片下载下来,保存在本地。
然后生成网页时调用本地的图片,这样就不会出现在PDF中图片缺失的情况。
本次没有去设置详细的PDF参数,所以生成的PDF排版并不是很友好,不过还是能凑合看的。
具体转换代码如下。
import pandas as pd
import requests
import pdfkit
import os
import re
# 读取数据并清洗
df = pd.read_csv('article.csv', header=None, names=['title', 'digest', 'article_url', 'date'], encoding='gbk')
df['date'] = pd.to_datetime(df.date.values, unit='s', utc=True).tz_convert('Asia/Shanghai')
df_date = df['date'].astype(str).str.split(' ', expand=True)
df['day'] = df_date[0]
# 获取目录的绝对路径
fileDir = os.path.abspath(os.path.dirname('F:\article_pdf'))
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400",
}
proxies = {
"https": None,
"http": None,
}
# 设置转PDF参数
options = {
"page-size": "Letter",
"encoding": "UTF-8",
"custom-header": [
("Accept-Encoding", "gzip")
]
}
# 调用wkhtmltopdf
# confg = pdfkit.configuration(wkhtmltopdf=r"C:UsersAdministratorwkhtmltox-0.12.5-1.mxe-cross-win64wkhtmltoxbinwkhtmltopdf.exe")
for title, url, date in zip(df['title'], df['article_url'], df['day']):
print(title, url, date)
# 替换特殊符号
title = re.sub('[/::*?"<>|]', '', title)
title = title.replace('\', '_')
# html文件名
html_name = '{}/{}.html'.format('F:\article_pdf', date + '_' + title)
res = requests.get(url, headers=headers, proxies=proxies, timeout=3)
html = res.text
# 用?来控制正则贪婪和非贪婪匹配;(.*?) 小括号来控制是否包含匹配的关键字
pattern = re.compile(r'data-src="http.*?"')
result = pattern.findall(html)
picCnt = 0
for i in result:
picCnt = picCnt + 1
url = re.findall(r'"(.*?)"', i)[0]
# 图片名
picture_name = '{}/{}.png'.format('F:\article_pdf', str(picCnt))
# 调用本地图片
html = html.replace(url, picture_name)
# 获取图片内容
r = requests.get(url)
with open(picture_name, "wb+") as f:
f.write(r.content)
# 保存html文件
html = html.replace('data-src', 'src')
fd = open(html_name, 'w', encoding="utf-8")
fd.write(html)
fd.close()
pdf_name = '{}/{}.pdf'.format('F:\article_pdf', date + '_' + title)
try:
# html转pdf
pdfkit.from_file(html_name, pdf_name, options=options)
except:
pass
最后成功生成所有文章的PDF。
这里不知是为何,生成PDF的时间挺长的,平均一个PDF耗时三分钟。
- MySQL和Oracle对比之存储过程(r5笔记第7天)
- 07.Java变量类型
- OAuth 2.0验证【面试+工作】
- MySQL备份恢复第一篇(r5笔记第5天)
- 经典面试问题: Top K 之 -- 海量数据找出现次数最多或,不重复的
- Java多线程详解4【面试+工作】
- Java多线程详解5【面试+工作】
- Java多线程详解6【面试+工作】
- MySQL备份恢复第二篇(r5笔记第6天)
- SpringMVC 中配置 Swagger 插件.
- MySQL和Oracle对比学习之事务(r5笔记第4天)
- 【面试宝典】Java如何打印数组
- MySQL数据导入导出牛刀小试(r5笔记第3天)
- SpringMVC 异常处理.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- vue接入腾讯地图(一)【点击事件】
- Redis文件事件&时间事件处理机制
- Redis持久化策略
- Redis二进制安全的原理
- 面试必备 Vue 知识点
- 数据传输 | mysqldiff/mysqldbcompare 实现 DTLE 自动化测试
- CPU有个禁区,内核权限也无法进入!
- 分布式 | DBLE 3.20.07.0 来啦!
- C语言三剑客之《C陷阱与缺陷》一书精华提炼
- Linux进程间通信(上)之管道、消息队列实践
- FPGA上电时序
- 更新Kubernetes APIServer证书
- R语言连续时间马尔科夫链模拟案例 Markov Chains
- 如何用R语言在机器学习中建立集成模型?
- 从零开始Kubernetes Operator