使用BeautifulSoup 4和Pillow合并网页图片到一个PDF:一种高效的方式来处理网页图像

背景

​ 网页上的培训材料,内容全是PPT页面图片。直接通过浏览器打印,会存在只打印第一页,并且把浏览器上无效信息也打印出来情况。但目标是希望将页面图片全部打印为pdf形式。

在这里插入图片描述

实现方案

  1. 利用网页“另存为”,将页面内所有图片资源下载到本地;
  2. 利用页面html源码,解析出图片下载名与标准名之间对应关系;
  3. 格式化标准名,按文件名顺序排序;
  4. 按文件名顺序合并所有图片到一个pdf文件中。

技术点

  1. 利用BS4解析html文档
  2. 利用PIL的Image合并图片到pdf

操作步骤

  1. 打开页面并选择“另存为”。

    在这里插入图片描述

  2. 保存到F:\course目录下

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  3. 将所有图片文件复制到tmp目录

    通过分析页面图片,所有有效图片都是后缀为JPG格式的图片。

    在这里插入图片描述

    在这里插入图片描述

  4. 运行read_html.py文件,标准化tmp目录下图片文件名

    1、使用img标签下的alt文件名替换tmp目录下文件名。(本处实现,发现下载图片文件名为src下文件名,但alt属性中文件名更便于理解和排序)

    2、将文件名中编号规整,保持3位数字。(本处实现,最大的序号为366;名称为“幻灯片2.JPG”的会显示在“幻灯片11.JPG”的后面,需要将“幻灯片2.JPG’和”幻灯片11.JPG“规整为"幻灯片002.JPG"和”幻灯片011.JPG“)

    在这里插入图片描述

  5. 运行merge_img2pdf.py文件,将tmp目录下所有图片合并成一个pdf文件

    在这里插入图片描述

    在这里插入图片描述

源代码及注释

# content of read_html.py
# 解析本地html文件,并将图片文件标准化命名
import re
import os
from bs4 import BeautifulSoupdef main():img_dict = {}soup = BeautifulSoup(open('个人中心-云阅读_希赛网.html')) # 读取另存为生成的html文件imgs = soup.find_all('img') # 获取所有img标签for img in imgs:if len(img['alt']) == 0:    # 过滤掉img标签中alt属性内容为空的字段continuereal_name = img['alt']if len(real_name) == 9:     # 标准化img文件名,全部变为"幻灯片XXX.JPG"形式real_name = real_name[0:3]+'0'+real_name[3:]elif len(real_name) == 8:real_name = real_name[0:3]+'00'+real_name[3:]img_dict[os.path.basename(img['src'])] = real_name  # 构造字典,key为下载到本地的文件名,value为易读的待修改后的文件名print(img_dict)os.chdir('tmp') # 切换到tmp目录下for old_file_name, new_file_name in img_dict.items():if os.path.exists(old_file_name):   # 若实际文件存在才进行更名try:    # 增加异常捕获,alt属性名称存在同名情况,有发生异常风险。os.rename(old_file_name,new_file_name)  # 重命令文件except:passif __name__ == "__main__":main()
# content of merge_img2pdf.py
# 遍历tmp下所有jpg文件,并在运行目录下生成pdf文件
from io import BytesIO
from PIL import Image
import osdef get_file_list():file_list = []for file in os.listdir():   # 遍历目录下所有JPG或jpg文件,并保存到file_list列表中,列表中图片顺序根据文件名称排序。if file.endswith('JPG') or file.endswith('jpg'):file_list.append(file)return file_listdef convert_to_pdf(file_list:list):sources = []output = Image.open(file_list[0])   # Image中加入第一张图片print(file_list)file_list.pop(0) # 从列表中去除第一张图片for file in file_list:file = Image.open(file) # 逐张打开图片if file.mode == "RGB":file = file.convert("RGB")sources.append(file) # 并添加到sources列表中os.chdir('..') # 返回程序运行目录output.save("output.pdf","pdf",save_all=True,append_images=sources) # 保存图片到pdf文件中,创建output时已经设置了第一张图片,append_images列表中按顺序保存了其它图片内容。def main():os.chdir('tmp') # 进入tmp目录下file_list = get_file_list()convert_to_pdf(file_list)if __name__ == "__main__":main()

后续优化

  • 目前是通过命令行方式运行,可以考虑通过pyside6做页面。
  • 当前只适配了希赛一个网站,根据后续需求增加程序的适配图片格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/215266.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建智能外卖跑腿小程序:技术实践与代码示例

在快节奏的现代生活中,外卖跑腿服务已成为人们日常生活中不可或缺的一部分。为了提供更智能、高效的外卖跑腿体验,本文将深入探讨构建一款智能外卖跑腿小程序所需的关键技术,并提供相应的代码示例。 1. 地理位置服务的整合 外卖跑腿小程序…

ChatGPT可能即将发布新版本,带有debug功能:支持下载原始对话、可视化对话分支等

本文原文来自DataLearnerAI官方网站:ChatGPT内置隐藏debug功能:支持下载原始对话、可视化对话分支等 | 数据学习者官方网站(Datalearner) AIPRM的工作人员最近发现ChatGPT的客户端隐藏内置了一个新的debug特性,可以提高ChatGPT对话的问题调试…

深度学习 Day14——P3天气识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…

Qt/QML编程学习之心得:工程中的文件(十二)

Qt生成了工程之后,尤其在QtCreator产生对应的project项目之后,就如同VisualStudio一样,会产生相关的工程文件,那么这些工程文件都是做什么的呢?这里介绍一下。比如产生了一个Qt Widget application,当然如果Qt Quick Application工程会有所不同。 一、.pro和.pro.user …

UE4/UE5 修改/还原场景所有Actor的材质

使用蓝图方法: 1.修改场景所有Actor 材质: Wirframe:一个材质类 MatList:获取到的所有模型的全部材质 的列表 TempAllClass:场景中所有获取的 Actor 的列表 功能方法如下: 蓝图代码可复制在&#xff1a…

Pytorch-LSTM轴承故障一维信号分类(一)

目录 前言 1 数据集制作与加载 1.1 导入数据 第一步,导入十分类数据 第二步,读取MAT文件驱动端数据 第三步,制作数据集 第四步,制作训练集和标签 1.2 数据加载,训练数据、测试数据分组,数据分batch…

Kubeadm 方式部署K8s集群

环境 主节点CPU核数必须是 ≥2核且内存要求必须≥2G,否则k8s无法启动 主机名地址角色配置kube-master192.168.134.165主节点2核4Gkube-node1192..168.134.166 工作节点2核4Gkube-node2192.168.134.163工作节点2核4G 1.获取镜像 谷歌镜像[由于国内网络原因…

简单的 u-popup 弹出框

uniapp中的popup组件可以用于弹出简单的提示框、操作框、菜单等。它可以通过position属性控制弹出框的位置,不同的position值会使得弹出框呈现不同的弹出形式 目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 …

DevEco Studio 3.1IDE环境配置(HarmonyOS 3.1)

DevEco Studio 3.1IDE环境配置(HarmonyOS 3.1) 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、环境安装 IDE下载地址:HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 IDE的安装就是…

hive-窗口函数

1 窗口函数语法 分析函数/专用窗口函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用的分析函数 常用的分析函数:sum()、max()、min()、avg()、count() 常用的专用窗口函数 专用窗口函数:row_number()、rank()、dens…

【Qt】Qt获取操作系统和网络信息示例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Qt获取操作系统和网络信息示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更…

没有明确的报错信息,阿里云国际版Windows服务器无法远程连接

在远程连接失败时,如果您没有收到系统返回的报错信息,并且ECS实例是运行中的状态,然后再根据以下步骤进行排查: 步骤一:使用阿里云Workbench工具测试远程登录 步骤二:检查是否有收到黑洞通知 步骤三&…

Hbase2.5.5分布式部署安装记录

文章目录 1 环境准备1.1 节点部署情况1.2 安装说明 2 Hbase安装过程Step1:Step2:Step3:Step4: 3 Web UI检查状态并测试3.1 Web UI3.2 创建测试命名空间 1 环境准备 1.1 节点部署情况 Hadoop11:Hadoop3.1.4 、 zookeeper3.4.6、jdk8 Hadoop1…

Unity之OpenXR+XR Interaction Toolkit接入微软VR设备Windows Mixed Reality

前言 Windows Mixed Reality 是 Microsoft 用于增强和虚拟现实体验的VR设备,如下图所示: 在国内,它的使用率很低,一把都是国外使用,所以适配起来是相当费劲。 这台VR设备只能用于串流Windows,启动后,会自动连接Window的Mixed Reality程序,然后打开微软的增强现实门户…

云原生的 CI/CD 框架tekton - Trigger(二)

上一篇为大家详细介绍了tekton - pipeline,由于里面涉及到的概念比较多,因此需要好好消化下。同样,今天在特别为大家分享下tekton - Trigger以及案例演示,希望可以给大家提供一种思路哈。 文章目录 1. Tekton Trigger2. 工作流程3…

在线学习平台-课程分页、用户管理、教师查询

在线学习平台------手把手教程👈 用户管理 添加功能增强 新增属性 若依里的用户模块(SysUser)是没有课程这一属性的,要实现我们自己的课程分页查询功能 这个位置传入的实体类SysUser要加上classId,记得加上get、set方法 更改sql语句 ctrl 鼠标左键不断点进去…

C++联合体union

联合体 将多个类型合并到一起省空间 枚举与联合一起使用 匿名联合 类似于无作用域 C11联合体定义非内建类型 C11 引入了能够在联合体中使用非内建类型的能力,这些类型包括具有自定义构造函数、析构函数、拷贝构造函数和拷贝赋值运算符的类。 关键特性…

如何将用户有过行为的item用list形式记录下来,另外如何计算list里的个数

导语: 最近做项目,发现有些语法想一想是知道,但实际操作起来跟想的情况不一样哈哈。不是遇见bug就是输出的结果不是自己想要的,CSDN跟知乎找了很多没怎么解决,后面多摸索多实操终于解决! test_data[item_…

JAVA实操经验

零: 按照需要,可以使用需要某个类下(主要是java提供的)的方法来实现某个功能。(主要是用在不同类下的方法会进行重写功能不同) 方法和构造方法不同:方法是方法,构造方法是构造器&a…

开箱即用的C++决策树简单实现

一个数据结构期末作业(有兴趣用的话可以高抬贵手star下⭐~)GitHub - mcxiaoxiao/c-Decision-tree: 决策树c简单实现 🌳 c-Decision-tree 附大作业/课设参考文档.doc 🌳 c-Decision-tree Introduction 🙌 c-Decision…