內容概述
含水印掃描型PDF文件,其中某頁如下圖所示,用Python去除其頁頂及頁底的水印。
處理思路:PDF中的每一頁的水印的相對位置基本相同,將PDF每一頁輸出成圖片,然后進行圖片編輯,用白色填充方形覆蓋水印,最后這些處理后的圖片重新合成PDF文件。
該方法缺點:
- 處理后的得到PDF文件大小比原文件大了不少。
- 那種還可以提取文字的PDF,用該法處理后PDF文件就再不能提取文字了。
- 很難處理夾雜在文本中水印。
副作用:
- 禁止打印PDF變成可打印了。
先前步驟:
- 安裝poppler軟件,并將其執行文件所在文件夾路徑新添至環境變量Path(針對Windows系統)。
pip install pdf2image
pip install fpdf
放碼過來
將PDF輸出成圖片文件集
from pdf2image import convert_from_path
from PIL import ImageDraw# 100dpi對應文檔的長寬及水印左上右下坐標
filePath = "a.pdf"
dpi = 100 #
watermark1 = (290, 47, 536, 66)
watermark2 = (283, 1072, 542, 1165)
gWidth = 827
gHeight = 1170
###########dpi2 = 150 # 按需調整這個參數<===============
pages = convert_from_path(filePath, dpi2)
width, height = pages[0].size# 方便多次調整,不用次次用系統自帶繪圖軟件獲得坐標位置
# 長寬貌似不與dpi成比例關系
watermark1 = (watermark1[0] * width / gWidth, watermark1[1] * height / gHeight, \
watermark1[2] * width / gWidth, watermark1[3] * height / gHeight)watermark2 = (watermark2[0] * width / gWidth, watermark2[1] * height / gHeight, \
watermark2[2] * width / gWidth, watermark2[3] * height / gHeight)print(watermark1)
print(watermark2)num = 0
for page in pages:draw = ImageDraw.Draw(page)# 水印涂白,可用系統自帶繪圖軟件獲得坐標位置draw.rectangle(watermark1, fill = 'white')draw.rectangle(watermark2, fill = 'white')outPath = 'out/%d.jpg' % numprint(outPath)page.save(outPath, 'JPEG')num = num + 1
將處理后的圖片合成PDF文件
from fpdf import FPDF
from PIL import Image
import os,redef makePdf(pdfFileName, listPages):cover = Image.open(listPages[0])width, height = cover.sizepdf = FPDF(unit = "pt", format = [width, height])listPages.sort(key = lambda i : int(re.compile(r'(\d+)').search(i).group(1)))for page in listPages:print(page)pdf.add_page()pdf.image(page, 0, 0)pdf.output(pdfFileName, "F")makePdf("result.pdf", ["out/"+imgFileName for imgFileName in os.listdir('out') \if imgFileName.endswith("jpg")])
參考資料
- 用Python將多張圖片合并成一PDF文件
- GitHub - Belval/pdf2image: A python module that wraps the pdftoppm utility to convert PDF to PIL Image object