python编程新人,自从有了chatgpt后,用python编程使普通人也可以触手可达,但还是需要不断调试,本文就用python来处理PDF并记录过程。
一、下载wkhtmltopdf
到https://wkhtmltopdf.org/downloads.html网站下载对应版本的wkhtmltopdf,我是mac电脑,选择了 wkhtmltox-0.12.6-2.macos-cocoa.pkg,下载好点击安装时报错:无法打开“wkhtmltox-0.12.6-2.macos-cocoa.pkg”,因为它来自身份不明的开发者。
咨询chatgpt,回复如下:
如果你在macOS上打开下载的".pkg"文件时遇到“来自身份不明的开发者”的错误,可以按照以下步骤进行解决:
- 找到你下载的 ".pkg" 文件, 然后右键点击并选择 "打开" 选项。
- 在弹出窗口中,会显示一个类似于“xxx.pkg是从互联网上下载的。您是否要将其打开?”的消息,点击 "打开" 按钮。
- 之后就会弹出一个安装向导界面,按照提示进行操作即可完成安装。
这样做的目的是使 macOS 记住你同意打开了这个 ".pkg" 文件,以后再次使用该 ".pkg" 文件时系统不再报错。
通过右键点击打开并成功安装。
二、设置wkhtmltopdf环境变量
同样咨询chatgpt,您可以在终端中输入以下命令来添加环境变量:
echo 'export PATH="/usr/local/bin:/usr/local/sbin:$PATH"' >> ~/.bashrc
这会将该命令自动添加到 ~/.bashrc
文件的末尾,使得每次打开新的终端时都能够生效。
如果您想要立即生效,则可以在当前终端中执行该命令:
export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
三、安装pdfkit包
在终端中执行命令:
pip install pdfkit
四、代码实现
1.导入包
import time
import pdfkit
import requests
from PIL import Image
import os
from PyPDF2 import PdfMerger, PdfReader, PdfWriter
from bs4 import BeautifulSoup
2.转PDF
尝试了两种方式,from_url()和from_string(),from_string()生成pdf效果不太好
# 获取网页信息,并返回soup
def get_html(url, max_try_num=10, sleep_time=5):
# print(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
for i in range(max_try_num):
response = requests.get(url, headers=headers, timeout=30)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# pretty_html = soup.prettify()
# return pretty_html # 返回的是字符串
return soup
else:
print("链接失败", response)
time.sleep(sleep_time)
# 转换成pdf,并输出到本地
def html_to_pdf(url,folder_path):
soup = get_html(url)
title = soup.find('title').text.strip()
path_wkthmltopdf = r'/usr/local/bin/wkhtmltopdf'
config = pdfkit.configuration(wkhtmltopdf=path_wkthmltopdf)
options = {
"page-size": "A4",
"margin-top": "0.7in",
"margin-right": "0.7in",
"margin-bottom": "0.7in",
"margin-left": "0.7in"
# 'disable-smart-shrinking': '', # 关闭浏览器缩放功能
# 'no-stop-slow-scripts': '', # 允许脚本延迟
# 'javascript-delay': '1000' # 等待 JavaScript 执行完成再生成 PDF
}
file_path = folder_path + title +'.pdf'
print('执行中……')
try:
pdfkit.from_url(url, file_path, options=options, configuration=config)
# pdfkit.from_string(html, file_path, configuration=config, options=options)
except OSError as e:
print(f'PDF 转换错误:{e}')
print('执行完毕……')
# 主函数,还有另外几种pdf处理工具
if __name__ == "__main__":
folder = r"/Users/j/Desktop/pdf_tool/"
# 为每个可用的功能指定名称和相应的函数对象
functions = {
"compress": compress_pdf,
"combine_imgs": combine_imgs,
"combine_pdfs": combine_pdfs,
"html_pdf": html_to_pdf
}
# 根据需要运行的函数名称从映射字典中获取函数对象
# url = "https://zhuanlan.zhihu.com/p/532224591"
url = "https://www.w3schools.com/python/python_numbers.asp"
function_name = "html_pdf" # 可以更改该名称以选择不同函数
selected_function = functions.get(function_name)
# 如果没有找到匹配的函数,则打印错误消息并退出程序
if not selected_function:
print(f"No function found with name: {function_name}")
exit()
# 将参数传递给所选的函数并运行它
if function_name == "compress":
folder_path = folder + "compress/"
selected_function(folder_path)
elif function_name == "combine_imgs":
folder_path = folder + 'img/'
selected_function(folder_path)
elif function_name == "combine_pdfs":
folder_path = folder + 'pdf/'
selected_function(folder_path)
elif function_name == "html_pdf":
folder_path = folder + 'html/'
selected_function(url, folder_path)
五、pdf效果
对比原始页面效果还不错
六、总结
1.chatgpt真是个好东西,上面过程中从下载软件,配置环境,到代码查错,全部都可以向其咨询,精准解决各种问题。
2.两种处理方式from_url()和from_string()研究得不够清楚,另外对options中的参数也没有仔细吃透,等有时间再详细研究。
3.对静态url页面的处理好于动态页面。
以上是我在上发表的第一篇文章,不为别的,只为记录第一次独立研究完成一个小工具,告别小白的第一步从chatgpt开始。