用Python处理PDF(一)-网页导出成PDF

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"文件时遇到“来自身份不明的开发者”的错误,可以按照以下步骤进行解决:

  1. 找到你下载的 ".pkg" 文件, 然后右键点击并选择 "打开" 选项。
  2. 在弹出窗口中,会显示一个类似于“xxx.pkg是从互联网上下载的。您是否要将其打开?”的消息,点击 "打开" 按钮。
  3. 之后就会弹出一个安装向导界面,按照提示进行操作即可完成安装。

这样做的目的是使 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效果

用Python处理PDF(一)-网页导出成PDF_第1张图片

对比原始页面效果还不错

用Python处理PDF(一)-网页导出成PDF_第2张图片

 六、总结

1.chatgpt真是个好东西,上面过程中从下载软件,配置环境,到代码查错,全部都可以向其咨询,精准解决各种问题。

2.两种处理方式from_url()和from_string()研究得不够清楚,另外对options中的参数也没有仔细吃透,等有时间再详细研究。

3.对静态url页面的处理好于动态页面。

以上是我在CSDN上发表的第一篇文章,不为别的,只为记录第一次独立研究完成一个小工具,告别小白的第一步从chatgpt开始。

你可能感兴趣的:(pdf,python,爬虫)