当前位置:   article > 正文

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

python 网页转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.导入包

  1. import time
  2. import pdfkit
  3. import requests
  4. from PIL import Image
  5. import os
  6. from PyPDF2 import PdfMerger, PdfReader, PdfWriter
  7. from bs4 import BeautifulSoup

2.转PDF

尝试了两种方式,from_url()和from_string(),from_string()生成pdf效果不太好

  1. # 获取网页信息,并返回soup
  2. def get_html(url, max_try_num=10, sleep_time=5):
  3. # print(url)
  4. headers = {
  5. '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'}
  6. for i in range(max_try_num):
  7. response = requests.get(url, headers=headers, timeout=30)
  8. if response.status_code == 200:
  9. soup = BeautifulSoup(response.text, 'html.parser')
  10. # pretty_html = soup.prettify()
  11. # return pretty_html # 返回的是字符串
  12. return soup
  13. else:
  14. print("链接失败", response)
  15. time.sleep(sleep_time)
  16. # 转换成pdf,并输出到本地
  17. def html_to_pdf(url,folder_path):
  18. soup = get_html(url)
  19. title = soup.find('title').text.strip()
  20. path_wkthmltopdf = r'/usr/local/bin/wkhtmltopdf'
  21. config = pdfkit.configuration(wkhtmltopdf=path_wkthmltopdf)
  22. options = {
  23. "page-size": "A4",
  24. "margin-top": "0.7in",
  25. "margin-right": "0.7in",
  26. "margin-bottom": "0.7in",
  27. "margin-left": "0.7in"
  28. # 'disable-smart-shrinking': '', # 关闭浏览器缩放功能
  29. # 'no-stop-slow-scripts': '', # 允许脚本延迟
  30. # 'javascript-delay': '1000' # 等待 JavaScript 执行完成再生成 PDF
  31. }
  32. file_path = folder_path + title +'.pdf'
  33. print('执行中……')
  34. try:
  35. pdfkit.from_url(url, file_path, options=options, configuration=config)
  36. # pdfkit.from_string(html, file_path, configuration=config, options=options)
  37. except OSError as e:
  38. print(f'PDF 转换错误:{e}')
  39. print('执行完毕……')
  40. # 主函数,还有另外几种pdf处理工具
  41. if __name__ == "__main__":
  42. folder = r"/Users/j/Desktop/pdf_tool/"
  43. # 为每个可用的功能指定名称和相应的函数对象
  44. functions = {
  45. "compress": compress_pdf,
  46. "combine_imgs": combine_imgs,
  47. "combine_pdfs": combine_pdfs,
  48. "html_pdf": html_to_pdf
  49. }
  50. # 根据需要运行的函数名称从映射字典中获取函数对象
  51. # url = "https://zhuanlan.zhihu.com/p/532224591"
  52. url = "https://www.w3schools.com/python/python_numbers.asp"
  53. function_name = "html_pdf" # 可以更改该名称以选择不同函数
  54. selected_function = functions.get(function_name)
  55. # 如果没有找到匹配的函数,则打印错误消息并退出程序
  56. if not selected_function:
  57. print(f"No function found with name: {function_name}")
  58. exit()
  59. # 将参数传递给所选的函数并运行它
  60. if function_name == "compress":
  61. folder_path = folder + "compress/"
  62. selected_function(folder_path)
  63. elif function_name == "combine_imgs":
  64. folder_path = folder + 'img/'
  65. selected_function(folder_path)
  66. elif function_name == "combine_pdfs":
  67. folder_path = folder + 'pdf/'
  68. selected_function(folder_path)
  69. elif function_name == "html_pdf":
  70. folder_path = folder + 'html/'
  71. selected_function(url, folder_path)

五、pdf效果

对比原始页面效果还不错

 六、总结

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/862088
推荐阅读
相关标签
  

闽ICP备14008679号