使用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.pswp.cn/news/213895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213895.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213895.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

官宣!「灣區之光群星演唱會」拉開2024新年音樂華麗序幕!

萬眾期待,群星薈萃!青春寶安時尚灣區——灣區之光群星演唱會即將在2024年1月5日閃耀亮相深圳寶安。 華語歌壇巨星天后齊聚一堂,攜手多位實力唱將,共同呈現一場無與倫比的演唱會盛宴!在深情而又充滿力量的歌聲之中&…

Linux修復磁盤壞道,重新掛載硬盤

修復磁盤 掛載報錯: [rootlocalhost ~]$ mount /dev/sdb /mnt/mydevmount: /dev/sdb is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sdb,missing codepage or helper program, or other errorIn some cases …

15、lambda表達式、右值引用、移動語義

前言 返回值后置 auto 函數名 (形參表) ->decltype(表達式) lambda表達式 lambda表達式的名稱是一個表達式 (外觀類似函數),但本質絕非如此 語法規則 [捕獲表] (參數表) 選項 -> 返回類型 { 函數體; }lambda表達式的本質 lambda表達式本質其實是一個類…

textarea文本框回車enter的時候自動提交表單,根據內容自動高度

切圖網近期一個bootstrap5仿chatgpt頁面的項目遇到的&#xff0c;textarea文本框回車enter的時候自動提交表單&#xff0c;根據內容自動高度&#xff0c;代碼如下&#xff0c;親測可用。 <textarea placeholder"Message ChatGPT…" name"" rows"&q…

TypeScript 第五節:條件語句

一、TypeScript 中常用的條件語句 TypeScript 的條件語句與 JavaScript 的條件語句類似&#xff0c;包括 if 語句、if...else 語句、switch 語句等。 1、if 語句 if 語句用于判斷指定條件是否為 true&#xff0c;如果是 true&#xff0c;則執行一段代碼塊。 示例&#xff1a;…

命名空間this_thread

命名空間 - this_thread 在C11中不僅添加了線程類&#xff0c;還添加了一個關于線程的命名空間std::this_thread&#xff0c;在這個命名空間中提供了四個公共的成員函數&#xff0c;通過這些成員函數就可以對當前線程進行相關的操作了。 1.get_id() 調用命名空間std::this_t…

java腳本引擎Groovy動態執行

1.java腳本引擎Groovy實戰_groovy腳本-CSDN博客 2.java可用的動態腳本引擎和動態代碼執行_java動態執行代碼片段-CSDN博客 3.Groovy動態加載Java代碼的使用方法和工具類_groovy調用java類方法-CSDN博客 4.springboot應用動態運行groovy腳本-附源碼 - 簡書 (jianshu.com) 5.…

是不是學了低代碼就自動放棄了高薪?內部資深解答來了!

目錄 前言低代碼開發&#xff1a;點餐還是自助烹飪&#xff1f;低代碼的“菜單”低代碼的局限性 市場影響的分析&#xff1a;一場關于低代碼的對話低代碼開發與程序員職業&#xff1a;名人視角解析總結 前言 近年來&#xff0c;低代碼開發因其低門檻、高效率和易集成的特點受到…

conda 計算當前包的個數

Conda是一個強大的包管理器和環境管理器&#xff0c;它用于安裝和管理來自不同源的軟件包。若要計算當前conda環境中安裝的包的數量&#xff0c;你可以使用以下命令&#xff1a; 首先&#xff0c;激活你想要檢查的conda環境&#xff08;如果不是默認的base環境&#xff09;&am…

虹科新聞丨廣州市“強企增效”項目助力虹科高質量發展!

來源&#xff1a;虹科電子科技有限公司 虹科新聞丨廣州市“強企增效”項目助力虹科高質量發展&#xff01; 原文鏈接&#xff1a;https://mp.weixin.qq.com/s/9pUXx5ZZpIi5S4s4o90GJA 歡迎關注虹科&#xff0c;為您提供最新資訊&#xff01; 2023年12月6日至7日&#xff0c;工…

hive/spark用法記錄

1. cast()更改數據類型 cast(column_name as type) 2. get_dt_date()自定義日期操作函數&#xff08;返回不帶橫線的日期&#xff09; select get_dt_date();–獲取當前日期&#xff0c;返回 20170209 select get_dt_date(get_date(-2));–獲取當前日期偏移&#xff0c;轉為…

如果將視頻轉化為gif格式圖

1.選擇視頻轉換GIF&#xff1a; 2.添加視頻文件&#xff1a; 3.點擊“開始”&#xff1a; 4.選擇設置&#xff0c;將格式選擇為1080P更加清晰&#xff1a; 5.輸出后的效果圖&#xff1a;

postgresql設置免密登錄

您提供的步驟描述了在 PostgreSQL 數據庫環境中配置服務器間的 SSH 無密碼登錄和數據庫用戶認證的過程。這些步驟主要用于設置一個高可用性、負載平衡的數據庫集群環境。讓我們逐一解釋這些步驟的目的和應用場景&#xff1a; 1. 啟動 PostgreSQL 服務 systemctl start postgr…

ReetrantReadWriteLock底層原理

文章目錄 一、讀寫鎖介紹二、ReentrantReadWriteLock底層原理1. 讀寫鎖的設計 一、讀寫鎖介紹 現實中有這樣一種場景:對共享資源有讀和寫的操作&#xff0c;且寫操作沒有讀操作那么頻繁(讀多寫少)。在沒有寫操作的時候&#xff0c;多個線程同時讀一個資源沒有任何問題&#xf…

jQuery-操作DOM

使用jQuery操作DOM dom : 文檔對象模型 就是HTML元素 $() 函數的2個用法: 用法1:放入一個字符串(選擇器)表示獲取元素 例如 $("p") $("#abc") $(".del") 用法2:放入一個函數&#xff0c;表示文檔就緒函數 例如 $(function(){代…

TikTok挑戰榜單:全球用戶如何共襄盛舉

TikTok作為全球最受歡迎的短視頻應用之一&#xff0c;在這個平臺上&#xff0c;用戶們通過參與各種挑戰&#xff0c;創造了無數令人驚嘆的短視頻。 本文將深入探討TikTok挑戰榜單的現象&#xff0c;探究全球用戶如何共襄盛舉&#xff0c;以及這種創意激發和社交互動如何成為Ti…

go-zero開發入門-API網關鑒權開發示例

本文是go-zero開發入門-API網關開發示例一文的延伸&#xff0c;繼續之前請先閱讀此文。 在項目根目錄下創建子目錄 middleware&#xff0c;在此目錄下創建文件 auth.go&#xff0c;內容如下&#xff1a; // 鑒權中間件 package middlewareimport ("context""e…

前端開發常用的Vscode插件整理(持續更新)

本文記錄用vscode進行前端開發時&#xff0c;常用到的有用的vscode插件&#xff0c;將不定時更新&#xff5e; 1、Chinese (Simplified) 將編輯器變成簡體中文 2、vscode-icon 讓 vscode 資源樹目錄加上圖標&#xff0c;官方出品的圖標庫 3、Import Cost 引入包大小計算,對于…

Springboot Redis Lua 分布式限流器

pom文件中添加如下依賴包&#xff0c;比較關鍵的就是 spring-boot-starter-data-redis 和 spring-boot-starter-aop。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></d…

基于ssm實驗室開放管理系統論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本實驗室開放管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信…