L’utilisation de filigranes dans les documents PDF est une pratique courante. Que ce soit pour des raisons de sécurité, de branding ou simplement pour marquer un document comme étant un brouillon, l’ajout d’un filigrane peut s’avérer très utile. Dans cet article, nous allons explorer une méthode pour ajouter des filigranes à vos fichiers PDF en utilisant Python, un langage de programmation puissant et polyvalent.
Dans l’idée voici ce que va faire le script que je vais vous présenter. A gauche l’image d’un PDF sans le filigrane et à droite l’image avec le filigrane. Notez que vous pourrez adapter cela à vos besoins, le positionnement, la couleur, le contenu… :
Pour ceux qui ne veulent pas lire les explications, vous pouvez télécharger directement le script en bas de page !
Prérequis
Avant de plonger dans le code, assurez-vous d’avoir installé Python sur votre ordinateur. Vous pouvez le télécharger depuis le site officiel de Python à l’adresse python.org. Ce script Python utilise les bibliothèques PyPDF2 et ReportLab pour créer et appliquer des filigranes. PyPDF2 sert à manipuler les fichiers PDF, tandis que ReportLab est utilisé pour créer des graphiques et du texte :
pip install PyPDF2 reportlab
Étape 1 : Importer les Modules Nécessaires
Le script que je vais vous détailler ici permet d’ajouter un filigrane sur chaque page d’un document PDF. Celui-ci est positionné en bas à droite de mes PDF. Le filigrane est composé de deux lignes de texte, dont vous pouvez personnaliser le contenu, la taille et la couleur. Le script commence par importer les modules nécessaires :
import io from PyPDF2
import PdfWriter, PdfReader from reportlab.pdfgen
import canvas from reportlab.lib.colors
import red
Étape 2 : La Fonction add_watermark
La fonction add_watermark est le cœur du script. Elle prend en entrée le chemin du fichier PDF original, le chemin de sortie, et deux lignes de texte pour le filigrane. Commençons donc par initier notre fonction :
def add_watermark(input_pdf, output_pdf, watermark_line1, watermark_line2):
Étape 3 : Création du Filigrane
Le filigrane est créé en utilisant ReportLab. Nous définissons la couleur, la police, la taille et le positionnement du texte. N’hésitez pas à changer les paramètres en fonction de vos besoins :
watermark_stream = io.BytesIO()
width = 1500 # à ajuster selon vos besoins
height = 1000 # à ajuster selon vos besoins
c = canvas.Canvas(watermark_stream, pagesize=(width, height))
c.setFillColor(red)
font_name = "Helvetica" #Ajustez la police selon vos besoins
font_size = 40 # Ajustez la taille selon vos besoins
c.setFont(font_name, font_size)
c.drawString(500, 100, watermark_line1) # Ligne du haut
c.drawString(500, 50, watermark_line2) # Ligne du bas
c.save()
Bon pour vous aider à personnaliser le script, voici une petite explication des lignes précédentes :
- width = 1500 : Cette ligne définit la largeur du filigrane en pixels. Ici, elle est définie sur 1500 pixels, mais cette valeur peut être ajustée en fonction de la taille souhaitée pour le filigrane.
- height = 1000 : De manière similaire, cette ligne définit la hauteur du filigrane en pixels, ici fixée à 1000 pixels. Elle peut également être modifiée en fonction des besoins.
- c = canvas.Canvas(watermark_stream, pagesize=(width, height)) : Cette ligne crée un nouvel objet canvas (toile) à l’aide de la bibliothèque ReportLab. watermark_stream est un flux de données en mémoire (BytesIO) où le filigrane sera dessiné. La pagesize est définie par les dimensions (largeur et hauteur) précédemment spécifiées.
- c.setFillColor(red) : Ici, la couleur du texte du filigrane est définie. red indique que le texte du filigrane sera de couleur rouge. La bibliothèque ReportLab offre une variété de couleurs prédéfinies ou permet de définir des couleurs personnalisées.
- font_name = « Helvetica » : Cette ligne définit le nom de la police utilisée pour le texte du filigrane. Ici, elle est définie sur Helvetica, mais peut être changée en fonction des préférences ou des besoins.
- font_size = 40 : Ici, la taille de la police est définie. La valeur 40 peut être modifiée pour augmenter ou diminuer la taille du texte du filigrane.
- c.setFont(font_name, font_size) : Cette ligne applique la police et la taille de police définies précédemment au canvas.
- c.drawString(500, 100, watermark_line1) : Cette ligne dessine la première ligne du texte du filigrane sur le canvas. Les nombres 500 et 100 représentent les coordonnées x et y où le texte commence. watermark_line1 est le texte de la première ligne du filigrane.
- c.drawString(500, 50, watermark_line2) : De manière similaire à la ligne précédente, cette ligne dessine la deuxième ligne du texte du filigrane. La position en y est réglée à 50 pour que cette ligne apparaisse sous la première.
- c.save() : Enfin, cette ligne enregistre les modifications apportées au canvas, terminant ainsi la création du filigrane.
Étape 4 : Application du Filigrane
Une fois le filigrane créé, le script lit le fichier PDF d’entrée, applique le filigrane à chaque page, puis enregistre le résultat dans un nouveau fichier PDF.
watermark_stream.seek(0)
watermark = PdfReader(watermark_stream)
pdf = PdfReader(input_pdf)
pdf_writer = PdfWriter()
# Ajoutez le filigrane à chaque page
for i in range(len(pdf.pages)):
page = pdf.pages[i]
page.merge_page(watermark.pages[0])
pdf_writer.add_page(page)
with open(output_pdf, 'wb') as output_file_handle:
pdf_writer.write(output_file_handle)
- watermark_stream.seek(0) : Cette ligne remet le pointeur de lecture-écriture au début du flux watermark_stream. C’est important parce que, juste avant, le filigrane a été créé et enregistré dans ce flux. Pour le lire à nouveau (pour l’intégrer dans le PDF), il faut repartir du début du flux.
- watermark = PdfReader(watermark_stream) : Ici, un objet PdfReader est créé à partir du flux de données watermark_stream. Cet objet PdfReader contient le filigrane sous forme de PDF, prêt à être appliqué sur un autre fichier PDF.
- pdf = PdfReader(input_pdf) : Cette ligne crée un autre objet PdfReader, cette fois à partir du fichier PDF d’entrée (indiqué par input_pdf). Cet objet permet de lire et de manipuler les pages du fichier PDF original.
- pdf_writer = PdfWriter() : Ici, un objet PdfWriter est créé. Cet objet sera utilisé pour écrire et sauvegarder le nouveau fichier PDF qui inclura le filigrane.
- for i in range(len(pdf.pages)): : Cette ligne commence une boucle qui parcourt toutes les pages du PDF d’entrée. len(pdf.pages) donne le nombre total de pages dans le document.
- page = pdf.pages[i] : À l’intérieur de la boucle, cette ligne sélectionne la page actuelle du PDF en fonction de l’indice i.
- page.merge_page(watermark.pages[0]) : Cette commande fusionne la page actuelle du PDF (page) avec la première page du PDF de filigrane (qui contient le filigrane). Le filigrane est donc appliqué à la page en question.
- pdf_writer.add_page(page) : Après l’ajout du filigrane, la page modifiée est ajoutée à l’objet pdf_writer. Cela prépare cette page à être écrite dans le nouveau fichier PDF.
- with open(output_pdf, ‘wb’) as output_file_handle : Cette ligne ouvre le fichier de sortie (indiqué par output_pdf) en mode écriture binaire (‘wb’). Le mode binaire est utilisé parce que les fichiers PDF contiennent des données non textuelles.
- pdf_writer.write(output_file_handle) : Enfin, cette commande écrit toutes les pages modifiées (avec les filigranes ajoutés) dans le fichier de sortie. Après l’exécution de cette ligne, le fichier PDF de sortie contiendra toutes les pages du document original avec les filigranes appliqués.
Étape 5 : Exécution du script
Pour utiliser ce script, il suffit de définir les chemins des fichiers d’entrée et de sortie, ainsi que les lignes de texte du filigrane, puis d’appeler la fonction add_watermark. C’est ici qu’il faudra modifier des informations principalement :
input_file = "Mon_fichier_pdf_sans_filigrane.pdf"
output_file = "Fichier_PDF_avec_ajout_Filigrane.pdf"
watermark1 = "NE PAS REPRODUIRE"
watermark2 = "© All IT Network"
add_watermark(input_file, output_file, watermark1, watermark2)
- input_file = « Mon_fichier_pdf_sans_filigrane.pdf » : Cette ligne définit une variable input_file et lui assigne le chemin d’un fichier PDF comme valeur. Ici, « Mon_fichier_pdf_sans_filigrane.pdf » est le nom du fichier PDF d’entrée sur lequel vous voulez ajouter un filigrane. Ce fichier doit se trouver dans le même répertoire que le script Python, ou alors le chemin doit être spécifié de manière relative ou absolue.
- output_file = « Fichier_PDF_avec_ajout_Filigrane.pdf » : De manière similaire, cette ligne crée une variable output_file qui contient le nom du fichier PDF de sortie. Après l’exécution du script, ce fichier contiendra le contenu du PDF original avec le filigrane ajouté. Comme pour le fichier d’entrée, le chemin peut être relatif ou absolu.
- watermark1 = « NE PAS REPRODUIRE » : Ici, la variable watermark1 est définie avec la chaîne de caractères « NE PAS REPRODUIRE ». Cette chaîne représente la première ligne de texte du filigrane qui sera appliqué sur le PDF.
- watermark2 = « © All IT Network » : De la même façon, watermark2 est une variable qui contient la seconde ligne de texte du filigrane, ici « © All IT Network ».
- add_watermark(input_file, output_file, watermark1, watermark2) : Cette ligne appelle la fonction add_watermark que nous avons définie précédemment. Elle passe les variables input_file, output_file, watermark1 et watermark2 en tant qu’arguments. La fonction utilisera ces informations pour lire le fichier PDF original (input_file), ajouter les lignes de filigrane (watermark1 et watermark2), et écrire le résultat dans le fichier de sortie (output_file).
Pour ceux qui le souhaite, voici le script complet à copier si vous le souhaitez :
Sinon voici directement le fichier « .py » que je vous transmets dans un fichier zip 😎 :
Ce script Python est un outil pratique pour ajouter rapidement des filigranes personnalisés à vos documents PDF. Il est flexible, facile à adapter à vos besoins spécifiques, et peut être intégré dans des workflows automatisés pour traiter de nombreux documents en peu de temps.
Si l’article vous a plu et si vous aimez mon travail, vous pouvez faire un don en suivant ce lien :