Supprimer le filigrane dans un PDF scanné avec Python

Aperçu du contenu

Un fichier PDF numérisé en filigrane, dont l'un est illustré dans la figure ci-dessous, utilise Python pour supprimer le filigrane en haut et en bas de la page.
insérez la description de l'image ici
Idée de traitement : la position relative du filigrane sur chaque page du PDF est fondamentalement la même. Sortez chaque page du PDF sous forme d'image, puis modifiez l'image, remplissez le carré de blanc pour couvrir le filigrane, et enfin recomposez le fichier traité. photos dans un fichier PDF.

Inconvénients de cette méthode :

  1. La taille du fichier PDF obtenu après traitement est beaucoup plus grande que le fichier d'origine.
  2. Le type de PDF qui peut également extraire du texte, après traitement avec cette méthode, le fichier PDF ne peut plus extraire de texte.
  3. Difficile de gérer les filigranes mélangés dans le texte.

effet secondaire:

  1. Désactiver l'impression Le PDF devient imprimable.

Étapes précédentes :

  1. Installez le logiciel poppler et ajoutez le chemin du dossier où se trouve son fichier exécutable à la variable d'environnement Path (pour les systèmes Windows).
  2. pip install pdf2image
  3. pip install fpdf

Classement terminé

Exporter un fichier PDF vers un ensemble de fichiers image

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' % num
    
    print(outPath)
    page.save(outPath, 'JPEG')
    num = num + 1

Combinez les images traitées dans des fichiers PDF

from fpdf import FPDF
from PIL import Image
import os,re

def makePdf(pdfFileName, listPages):

	cover = Image.open(listPages[0])
	width, height = cover.size

	pdf = 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")])

Références

  1. Combinez plusieurs images dans un seul fichier PDF avec Python
  2. GitHub - Belval/pdf2image : un module python qui encapsule l'utilitaire pdftoppm pour convertir un PDF en objet PIL Image

Je suppose que tu aimes

Origine blog.csdn.net/u011863024/article/details/123321179
conseillé
Classement