【fitz+PIL】PDF圖片文字顏色加深

文章目錄

    • 0 引言
    • 1 解決思路及流程
      • 1.1 思路
      • 1.2 代碼實現
    • 2 完整代碼與效果
    • 3 總結

0 引言

沒錯,這是連續劇。女友對上一篇【fitz+OpenCV】去除PDF圖片中的水印得到的去水印效果很滿意,于是問我可不可以再幫她處理一下另一個PDF文件,我二話不說答應了下來。原PDF文件是一本教材的電子版,每頁都是一張圖片,和上一篇文章中PDF的類型相同,不過本文中需要解決的問題是,原圖中文字顏色太淺,看著費眼睛,如下圖所示,需要將文字顏色加深。

image-20250710203703384

1 解決思路及流程

1.1 思路

在大致分析了PDF組成后(其中紅色的為筆記標注,和頁面圖片單獨存在),這個問題的解決思路也相當明晰了,便是將每頁的圖片單獨提取出來,對圖片進行文字加深處理,這里可以通過增加圖片對比度實現(對比度就是畫面中明暗部分的亮度比,對比度越高,則圖像中明暗部分的差異就越大。根據這一原理,將對比度增大后,原本顏色較深的文字部分將會更深,反之,顏色較淺的背景將會更亮)。

1.2 代碼實現

在代碼方面中,我們依然采用fitzpip install PyMuPDF)作為PDF處理庫,圖片的處理則是基于圖像庫PILpip install pillow)。

首先我們打開待處理的PDF文件,對每頁進行遍歷,提取每頁的圖片,為了防止個別頁面存在多張圖片,又嵌套了個for循環以遍歷頁內圖片。

doc = fitz.open(input_pdf)  # 打開原PDF
for page_num in range(len(doc)):# 獲取頁面圖片page = doc.load_page(page_num)page_imgs = page.get_images()for page_img in page_imgs:xref = page_img[0]img_info = doc.extract_image(xref)img = Image.open(io.BytesIO(img_info["image"]))  # 轉換為 PIL Image,方便處理

接下來處理每張圖片,factor為對比度值,取1函數返回原圖像,如果要增加圖像對比度,該參數應大于1.0,本文示例中取3.0。

# 增強圖片
enhancer = ImageEnhance.Contrast(img)  # 增強對比度(使文字更清晰)
enhanced_img = enhancer.enhance(factor=contrast)

用增強后的圖片替換原圖片,這一步僅僅改變了背景圖片的信息,不影響前景的筆記標注。其中quality參數用于控制圖像的質量,決定圖像的體量與清晰度,progressive用于控制是否生成漸進式JPEG,實測該保存方式得到的圖片體積更小,dpi參數用于控制圖片兩個方向的dpi。

# 替換原圖片
bio = io.BytesIO()
enhanced_img.save(bio, format=img_info["ext"], quality=50, progressive=True, dpi=(300, 300))
page.replace_image(xref, stream=bio)

最后一步,在所有頁面處理完成后,保存輸出處理后的PDF。

# 保存PDF
doc.save(output_pdf)
doc.close()

2 完整代碼與效果

完整代碼如下:

import io
import fitz  # PyMuPDF
from PIL import Image, ImageEnhancedef process_pdf(input_pdf, output_pdf, contrast):doc = fitz.open(input_pdf)  # 打開原PDFfor page_num in range(len(doc)):# 獲取頁面圖片page = doc.load_page(page_num)page_imgs = page.get_images()for page_img in page_imgs:xref = page_img[0]img_info = doc.extract_image(xref)img = Image.open(io.BytesIO(img_info["image"]))  # 轉換為 PIL Image,方便處理# 增強圖片enhancer = ImageEnhance.Contrast(img)  # 增強對比度(使文字更清晰)enhanced_img = enhancer.enhance(factor=contrast)# 替換原圖片bio = io.BytesIO()enhanced_img.save(bio, format=img_info["ext"], quality=50, progressive=True, dpi=(300, 300))page.replace_image(xref, stream=bio)# 保存PDFdoc.save(output_pdf)doc.close()print(f"PDF處理完成!輸出文件: {output_pdf}")if __name__ == "__main__":input_pdf = 'example.pdf'output_pdf = 'output.pdf'process_pdf(input_pdf, output_pdf, contrast=3.0)

處理效果如下圖所示:

image-20250710212242933

效果還是不錯的。

3 總結

該方法和上一篇文章中的方法存在一個共性問題,便是生成的PDF文件體量太大,比原本文件的大了近3~4倍,該問題打算后面有時間研究一下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88664.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88664.shtml

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

相關文章

tp8.0\jwt接口安全驗證

環境&#xff1a;php8.3\tp8.1\firebase-jwt6.1app\middleware\JwtAuth<?php namespace app\middleware;use app\common\library\JwtHandler; use think\Request; use think\facade\Env;class JwtAuth {public function handle(Request $request, \Closure $next){// 獲取當…

ReactNative【實戰系列教程】我的小紅書 5 -- 文章詳情(含輪播圖 ImageSlider,點亮紅心動畫 Heart,嵌套評論等)

最終效果 安裝依賴 npm i dayjs用于對時間進行格式化 必備組件 輪播圖 ImageSlider https://blog.csdn.net/weixin_41192489/article/details/149224510 點亮紅心動畫 Heart components/Heart.tsx import AntDesign from "expo/vector-icons/AntDesign"; import …

嗶哩嗶哩第三方TV-BBLL最新版

—————【下 載 地 址】——————— 【?本章下載一】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【?本章下載二】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【百款黑科技】&#xff1a;https://uc…

用YOLOv5系列教程(1)-用YOLOv5輕松實現設備狀態智能監控!工業級教程來了

用YOLOv5輕松實現設備狀態智能監控&#xff01;工業級教程來了設備運維革命&#xff1a;15分鐘教會你的攝像頭看懂指示燈狀態工業現場各種設備狀態指示燈是工程師的"眼睛"——紅燈報警、綠燈運行、黃燈待機。但人工巡檢耗時費力&#xff0c;關鍵故障容易漏檢&#xf…

筆記-分布式計算基礎

Distributed Computing 劃分數據并行&#xff08;DataParallelism&#xff09;將數據分為n份&#xff0c;發送到n個GPU上&#xff0c;每個GPU上都存在一個完整的大模型 缺點&#xff1a; 模型太大Pipeline Parallelism&#xff08;串行的&#xff09;將模型做split,每個GPU負責…

Android Studio 2024,小白入門喂飯級教程

一、下載Android Studio 1、從安卓官網安卓官網下載Android Studio。 ? ? 二、安裝Android Studio 1、雙擊android-studio-2024.3.2.15-windows.exe。 ? ?? ? ? ? ? 三、新建工程 1、雙擊桌面圖標? 打開Android Studio。 ? 選“Empty Views Activity…

AI智能體 | 使用Coze制作一鍵生成單詞洗腦循環視頻,一天批量生成100條視頻不是夢!(附保姆級教程)

目錄 一、整體工作流設計 二、制作工作流 2.1 開始節點 2.2 大模型-單詞 2.3 大模型_圖像生成 2.4 輸出 2.5 圖像生成_1 2.6 輸出_2 2.7 畫板_2 2.8 文本處理 2.9 輸出_3 2.10 speech_synthesis_1x5 2.11 get_audio_duration_1 2.12 代碼 2.13 get_audio_durati…

質量屬性場景(Quality Attribute Scenario)深度解析

本質定義:質量屬性場景(Quality Attribute Scenario)是精確描述軟件系統質量要求的結構化方法,通過標準化的場景模板將抽象的質量屬性轉化為可測量、可驗證的具體行為描述,為架構設計提供客觀評估基準。 一、質量屬性場景核心結構 1. 六元組標準模板 #mermaid-svg-AGbvPVRu…

Java_Springboot技術框架講解部分(一)

首先講解一下&#xff1a;Java技術棧中&#xff0c;目前Spring Boot在國內的關注趨勢也日漸超過Spring。Spring Boot是Spring家族中的一個全新的框架&#xff0c;它用來簡化Spring應用程序的創建和開發過程。采用Spring Boot可以非常容易和快速的構建基于Spring框架的應用程序&…

從OpenMV到執行器:當PID算法開始“調教”舵機

如果到現在還不會驅動舵機——朋友&#xff0c;電賽的元器件清單每年都在對你“明示”&#xff0c;二維云臺都快成祖傳考題了&#xff01;補課&#xff1f;現在&#xff01;立刻&#xff01;&#xff08;當然&#xff0c;如果你臉皮夠厚&#xff0c;也可以私信騷擾作者&#xf…

xml映射文件的方式操作mybatis

映射文件 在Java spring中使用mybatis有兩種方式&#xff0c;一種是注釋的方式&#xff0c;一種是xml映射文件的方式。在簡單的功能需求可以使用注釋&#xff0c;方便簡潔。而在大的功能邏輯上&#xff0c;更推薦使用xml映射文件&#xff0c;方便管理且結構清晰。 首先xml文件結…

Carla自動駕駛仿真_快速安裝與運行Carla

大家好&#xff0c;我是橙子&#xff0c;今天給大家介紹Carla的基礎安裝和使用 目錄 1.Carla介紹 2.Carla的安裝與使用 3.Carla0.9.15安裝包下載&#xff1a; ?編輯 4.運行Demo 5.運行一個簡單場景&#xff1a; 6.相關資源 1.Carla介紹 Carla 是一個開源的自動駕駛仿…

遠程登錄docker執行shell報錯input is not a terminal問題

背景 最近要遠程去k8s docker里面獲取信息&#xff0c;于是&#xff0c;寫了一個如下的命令&#xff0c;執行完之后&#xff0c;報錯了。 ssh 192.168.100.2 sudo crictl exec -it xxx.docker /usr/bin/lscpu --online --extended錯誤信息如下&#xff1a; time“2025-07-11T21…

使用FastAdmin框架開發二

繼上一篇使用FastAdmin框架開發-CSDN博客教程 部署完項目后我們就可以邊開發邊調試了 在開發前我們可以先做一些基本設置 安裝成功后會生成一個項目后臺的地址http://域名/VrHGtzlfMB.php/index/login&#xff0c;后臺入口文件是隨機生成的&#xff0c;當然我們也可以根據我…

【DB2】load報錯SQL3501W、SQL3109N、SQL2036N

最近老遇到遷移測試LOAD時報錯&#xff0c;如圖所示但是換成import又可以看描述是說load的內容將不會進入備份暫掛狀態balbala… 下面的錯誤是說ixf文件無效 這里一直以為是SQL3501W的問題&#xff0c;去各種研究load參數和db2set里面的load參數&#xff0c;各種調整都不行 又以…

YOLO家族內戰!v5/v8/v10誰才是你的真命天子?(附保姆級選擇指南)

在目標檢測領域&#xff0c;YOLO系列始終是工業部署與學術研究的焦點。從風靡全網的YOLOv5&#xff0c;到全面升級的YOLOv8&#xff0c;再到突破性能瓶頸的YOLOv10——每一次迭代都帶來全新可能。作為開發者&#xff0c;究竟該選哪一代&#xff1f;本文用千字長文對比表格為你徹…

Claude Code是什么?國內如何使用到Claude Code?附國內最新使用教程

2025年已過大半&#xff0c;相信你也聽說過 Claude——它是近年最受關注的 AI 模型之一&#xff0c;而 Claude Code 則是它面向編程場景的特別版本&#xff0c;專為代碼理解、生成與重構而生&#xff0c;尤其擅長處理大項目、長上下文&#xff0c;和開發者對話更自然。 但對于一…

雙輪驅動:政策激勵與外部制約下的國產服務器市場演進

2025年6月&#xff0c;科智咨詢正式發布《中國國產服務器市場研究報告&#xff08;2025&#xff09;》&#xff0c;報告從國產服務器產業概述、政策環境分析、市場現狀與競爭格局、面臨挑戰與市場機遇等維度&#xff0c;深入剖析國產服務器市場現狀及未來發展趨勢。2022年10月&…

【工具變量】全國省市區縣土地出讓結果公告數據(2000-2024年)

土地出讓結果公告數據是指政府主管部門在完成國有土地使用權出讓后&#xff0c;依法依規對外公開的結果信息&#xff0c;涵蓋土地出讓時間、出讓方式、競得人、成交價、用地性質、面積等關鍵信息。土地出讓數據是研究中國土地市場供需變化、城市發展軌跡以及地方財政收入結構的…

前端面試專欄-算法篇:22.樹結構(二叉樹、B樹、紅黑樹)

&#x1f525; 歡迎來到前端面試通關指南專欄&#xff01;從js精講到框架到實戰&#xff0c;漸進系統化學習&#xff0c;堅持解鎖新技能&#xff0c;祝你輕松拿下心儀offer。 前端面試通關指南專欄主頁 前端面試專欄規劃詳情 樹結構&#xff08;二叉樹、B樹、紅黑樹&#xff09…