PDF批量刪除固定位置圖片工具 PDF PicKiller
- <center>PDF PicKiller [Download](https://github.com/Peaceful-World-X/PDF-PicKiller)
- 🤩 工具介紹
- 🥳 主要功能
- 🤪 軟件使用
- 🤪 參數解釋
- 🤪 關鍵代碼
- 🤩 項目代碼
PDF PicKiller Download
🤩 工具介紹
PDF PicKiller 是基于Python的PDF批處理工具,默認無感解密,使用命令行界面批量刪除固定位置圖像、漸變背景圖、水印圖或字,后續還有可能添加新功能,額…如果軟件有用的話~
🥳 主要功能
? 默認解密:無感處理(破解)加密的 PDF 文件(有打開權限),支持多種加密方式:RC4 128bits,
AES 128bits
, AES 256bits
等。
?對象提取:檢索模板頁(默認第1頁),并列出 XObject
圖像、Shadings
背景圖像和 Form
水印圖。
?批量刪除:批量高效的刪除列出的圖像對象,平均速度為 0.2 秒
處理每 1000 頁(每頁 5 個刪除對象)。
?交互式命令行:命令行界面,表情樣式可愛回復~
🤪 軟件使用
- 命令行綠色可執行文件,雙擊食用~
- 直接拖入PDF文件,或輸入文件地址
- 選擇模板頁(即有要刪除圖片的頁面),默認第一頁則回車
- 選擇模板頁中要刪除的對象名,默認刪除全部對象則回車
- 已批量刪除打開文件路徑~
- 隨時按下 Ctrl+C 退出軟件!
🤪 參數解釋
文檔一般圖片:
- 名字: /IM13, 寬度: 674, 高度: 149
- 名字: /IM15, 寬度: 640, 高度: 640
【這是一般圖片,通過寬度和高度來區別,IM15高度更大,IM13高度更小】
漸變背景圖片:
- 名字: /FXS1, 類型: 2-徑向漸變 (Radial), 坐標: [554.0, 0.85, 554.0, 253.6]
- 名字: /FXS2, 類型: 2-徑向漸變 (Radial), 坐標: [5.0321, 9.2981, 548.518, 249.612]
【這是背景圖片,通過漸變線起始坐標來區別,FXS1是水平漸變,FXS2是對角漸變】
水印圖片:
- 名字: /Form4, 類型: 圖片, 邊界: [0.0, 0.0, 182.0, 45.0]
- 名字: /KSPX191, 類型: 文字, 邊界: [0.0, -7.272, 288.0, 67.464]
【這是水印圖字,通過類型和邊界框起始坐標來區別,Form4高度更小,KSPX191高度更大】
🤪 關鍵代碼
- PDF解密
import pikepdf
pdf = pikepdf.open(input_pdf_path)# 判斷是否加密
if not pdf.is_encrypted:pdf.close()return input_pdf_path
pdf.close()
# 如果加密,重新用密碼打開
pdf = pikepdf.open(input_pdf_path)
output_file = input_pdf_path.replace('.pdf', '(decrypted).pdf')
pdf.save(output_file)
pdf.close()
print(f"\033[31m? 解密成功,保存為 {output_file}\033[0m")
return output_file
- 識別對象
def list_xobjects_and_shadings(page):result = {'images': [], # 每個元素是 (name, width, height)'shadings': [], # 每個元素是 (name, shading_type, coords)'watermarks': [] # 每個元素是 (name, resources, bbox)}try:resources = page.obj.get('/Resources')shadings = resources.get('/Shading')xobjects = resources.get('/XObject')# 處理XObject圖像if xobjects is None: return resultfor name, obj_ref in xobjects.items():try:obj = obj_ref.get_object()subtype = obj.get('/Subtype')if subtype == '/Image':width = obj.get('/Width', 'Unknown')height = obj.get('/Height', 'Unknown')result['images'].append((name, width, height))elif subtype == '/Form': # 檢查是否為水印 (Form)# 提取水印的資源和邊界框resources = obj.get('/Resources', 'Unknown')bbox = obj.get('/BBox', 'Unknown')bbox_list = [float(coord) for coord in bbox] if bbox else Noneresult['watermarks'].append((name, resources, bbox_list))except Exception as e_inner:print(f"?? 哎呀! 無法讀取 {name} 對象: {type(e_inner).__name__}: {e_inner}")continue# 處理Shading圖像if shadings is None: return resultfor name, obj_ref in shadings.items():try:obj = obj_ref.get_object()obj = obj_refshading_type = obj.get('/ShadingType', 'Unknown')coords = obj.get('/Coords', None)coords_list = [float(coord) for coord in coords] if coords else Noneresult['shadings'].append((name, shading_type, coords_list))except Exception as e_inner:print(f"?? 哎呀! 無法讀取 Shading {name}: {type(e_inner).__name__}: {e_inner}")continueexcept Exception as e:print(f"?? 糟糕! 列出XObject時出錯: {type(e).__name__}: {e}")return result
🤩 項目代碼
https://github.com/Peaceful-World-X/PDF-PicKiller
?歡迎反饋BUG,后續會視情況添加新功能!
(代碼是晚上為了處理一個PDF文件臨時寫的,有問題非常歡迎反饋~)