Fermer

janvier 14, 2025

Comment supprimer le texte barré des PDF à l’aide de Python / Blogs / Perficient

Comment supprimer le texte barré des PDF à l’aide de Python / Blogs / Perficient


Dans cet article de blog, je partagerai mon parcours de développement d’une solution basée sur Python pour supprimer le texte barré des PDF. Cette solution est spécialement conçue pour les PDF dans lesquels le barré est appliqué comme style plutôt que comme annotation.

Le défi

Le texte barré dans les PDF peut être difficile à gérer, principalement lorsqu’il est appliqué comme style. Les bibliothèques de manipulation PDF standard ne suffisent souvent pas dans ces cas. Déterminé à trouver une solution, j’ai exploité Python pour créer une approche pratique.

La solution

La solution comprend trois étapes principales : la conversion du PDF en fichier DOCX, la suppression du texte barré du fichier DOCX et la reconversion du fichier DOCX modifié en PDF.

Dépendances

Avant de plonger dans le code, installez les dépendances Python nécessaires. Vous aurez besoin de :
• pdf2docx pour convertir un PDF en DOCX
• python-docx pour manipuler les fichiers DOCX
• docx2pdf pour reconvertir DOCX en PDF

Vous pouvez installer ces dépendances en utilisant pip :

pip install pdf2docx python-docx docx2pdf

Guide étape par étape pour supprimer Texte barré à partir de PDF

Étape 1 : Convertir un PDF en DOCX

La première étape consiste à convertir le fichier PDF en fichier DOCX. Cela nous permet de manipuler le texte plus facilement. Nous utilisons la bibliothèque pdf2docx pour cette conversion. Voici le code de la fonction de conversion :

from pdf2docx import Converter
def convert_pdf_to_word(pdf_file, docx_file):
    """Convert PDF to DOCX format."""
    try:
        cv = Converter(pdf_file)
        cv.convert(docx_file, start=0, end=None)
        cv.close()
        print(f"Converted PDF to DOCX: {pdf_file} -> {docx_file}")
    except Exception as e:
        print(f"Error during PDF to DOCX conversion: {e}")
        sys.exit(1)

Dans cette fonction, nous créons une instance de la classe Converter, en passant le pdf_file comme argument. La méthode convert de la classe Converter est appelée pour effectuer la conversion et la méthode close est appelée pour libérer toutes les ressources utilisées par le convertisseur. Si la conversion réussit, un message est imprimé indiquant la conversion. Si une erreur se produit, une exception est interceptée et un message d’erreur est imprimé.

Étape 2 : Supprimer le texte barré

Une fois que nous avons le fichier DOCX, nous pouvons supprimer le texte barré. Cette étape consiste à parcourir les paragraphes et les exécutions dans le fichier DOCX et à vérifier le style barré. Nous utilisons la bibliothèque python-docx pour cette tâche. Voici le code de la fonction de suppression des barrés :

from docx import Document
def remove_strikethrough_text(docx_file):
    """Remove all strikethrough text from a DOCX file."""
    try:
        document = Document(docx_file)
        modified = False
        for paragraph in document.paragraphs:
            for run in paragraph.runs:
                if run.font.strike:
                    print(f"Removing strikethrough text: {run.text}")
                    run.text=""
                    modified = True
        if modified:
            modified_docx_file = docx_file.replace('.docx', '_modified.docx')
            document.save(modified_docx_file)
            print(f"Strikethrough text removed. Saved to: {modified_docx_file}")
            return modified_docx_file
        else:
            print("No strikethrough text found.")
            return docx_file
    except Exception as e:
        print(f"Error during strikethrough text removal: {e}")
        sys.exit(1)

Dans cette fonction, nous créons une instance de la classe Document, en passant le docx_file comme argument. Nous parcourons chaque paragraphe du document, puis chaque passage dans la section. Si l’attribut strike de la police de l’exécution est True, nous imprimons un message indiquant la suppression du texte barré et définissons le texte de l’exécution sur une chaîne vide. Si le texte barré a été supprimé, nous enregistrons le document modifié dans un nouveau fichier avec _modified ajouté au nom de fichier d’origine. Si aucun texte barré n’a été trouvé, nous renvoyons le fichier DOCX original.

Étape 3 : reconvertir le DOCX en PDF

La dernière étape consiste à reconvertir le fichier DOCX modifié en fichier PDF. Cela garantit que le texte barré est supprimé dans le PDF final. Nous utilisons la bibliothèque docx2pdf pour cette conversion. Voici le code de la fonction de conversion :

from docx2pdf import convert

def convert_docx_to_pdf(docx_file, output_pdf):
    """Convert DOCX back to PDF format."""
    try:
        convert(docx_file, output_pdf)
        print(f"Converted DOCX to PDF: {docx_file} -> {output_pdf}")
    except Exception as e:
        print(f"Error during DOCX to PDF conversion: {e}")
        sys.exit(1)

Nous appelons cette fonction la fonction de conversion, en passant le docx_file et le output_pdf comme arguments pour effectuer la conversion. Si la conversion réussit, un message est imprimé indiquant la conversion. Si une erreur se produit, une exception est interceptée et un message d’erreur est imprimé.

Bloc d’exécution principal

Le bloc de code suivant constitue la section d’exécution principale du script. Cela commence par vérifier si le script est exécuté directement. Il vérifie ensuite que le nombre correct d’arguments de ligne de commande est fourni et que le fichier PDF spécifié existe. Si ces conditions sont remplies, le script définit les chemins de fichiers intermédiaires et effectue les trois étapes principales : convertir le PDF en fichier DOCX, supprimer le texte barré du fichier DOCX et reconvertir le DOCX modifié en PDF. Après avoir terminé ces étapes, il imprime l’emplacement du fichier PDF modifié et nettoie tous les fichiers intermédiaires. Si des erreurs se produisent lors de l’exécution, elles sont détectées et imprimées, et le script se termine correctement.

if __name__ == "__main__":
    if len(sys.argv) != 2:
        sys.exit(1)

    pdf_file = sys.argv[1]

    if not os.path.exists(pdf_file):
        print(f"Error: File not found - {pdf_file}")
        sys.exit(1)

    try:
        # Define intermediate file paths
        base_name = os.path.splitext(pdf_file)[0]
        temp_docx_file = f"{base_name}.docx"
        modified_docx_file = f"{base_name}_modified.docx"
        output_pdf_file = f"{base_name}_modified.pdf"

        # Step 1: Convert PDF to DOCX
        convert_pdf_to_word(pdf_file, temp_docx_file)

        # Step 2: Remove strikethrough text
        final_docx_file = remove_strikethrough_text(temp_docx_file)

        # Step 3: Convert modified DOCX back to PDF
        convert_docx_to_pdf(final_docx_file, output_pdf_file)

        print(f"Modified PDF saved to: {output_pdf_file}")

        # Clean up intermediate DOCX files
        if os.path.exists(temp_docx_file):
            os.remove(temp_docx_file)
        if final_docx_file != temp_docx_file and os.path.exists(final_docx_file):
            os.remove(final_docx_file)

    except Exception as e:
        print(f"Error: {e}")
        sys.exit(1)

Scénario complet

import sys
import os
from pdf2docx import Converter
from docx import Document
from docx2pdf import convert

def convert_pdf_to_word(pdf_file, docx_file):
    """Convert PDF to DOCX format."""
    try:
        cv = Converter(pdf_file)
        cv.convert(docx_file, start=0, end=None)
        cv.close()
        print(f"Converted PDF to DOCX: {pdf_file} -> {docx_file}")
    except Exception as e:
        print(f"Error during PDF to DOCX conversion: {e}")
        sys.exit(1)

def remove_strikethrough_text(docx_file):
    """Remove all strikethrough text from a DOCX file."""
    try:
        document = Document(docx_file)
        modified = False

        for paragraph in document.paragraphs:
            for run in paragraph.runs:
                if run.font.strike:
                    print(f"Removing strikethrough text: {run.text}")
                    run.text=""
                    modified = True

        if modified:
            modified_docx_file = docx_file.replace('.docx', '_modified.docx')
            document.save(modified_docx_file)
            print(f"Strikethrough text removed. Saved to: {modified_docx_file}")
            return modified_docx_file
        else:
            print("No strikethrough text found.")
            return docx_file
    except Exception as e:
        print(f"Error during strikethrough text removal: {e}")
        sys.exit(1)

def convert_docx_to_pdf(docx_file, output_pdf):
    """Convert DOCX back to PDF format."""
    try:
        convert(docx_file, output_pdf)
        print(f"Converted DOCX to PDF: {docx_file} -> {output_pdf}")
    except Exception as e:
        print(f"Error during DOCX to PDF conversion: {e}")
        sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) != 2:
        sys.exit(1)

    pdf_file = sys.argv[1]

    if not os.path.exists(pdf_file):
        print(f"Error: File not found - {pdf_file}")
        sys.exit(1)

    try:
        # Define intermediate file paths
        base_name = os.path.splitext(pdf_file)[0]
        temp_docx_file = f"{base_name}.docx"
        modified_docx_file = f"{base_name}_modified.docx"
        output_pdf_file = f"{base_name}_modified.pdf"

        # Step 1: Convert PDF to DOCX
        convert_pdf_to_word(pdf_file, temp_docx_file)

        # Step 2: Remove strikethrough text
        final_docx_file = remove_strikethrough_text(temp_docx_file)

        # Step 3: Convert modified DOCX back to PDF
        convert_docx_to_pdf(final_docx_file, output_pdf_file)

        print(f"Modified PDF saved to: {output_pdf_file}")

        # Clean up intermediate DOCX files
        if os.path.exists(temp_docx_file):
            os.remove(temp_docx_file)
        if final_docx_file != temp_docx_file and os.path.exists(final_docx_file):
            os.remove(final_docx_file)

    except Exception as e:
        print(f"Error: {e}")
        sys.exit(1)

Exécutez le script

Exécutez le script en exécutant la commande suivante, en la remplaçant par le chemin d’accès à votre fichier PDF :

python <script_name>.py <pdf_file_path>

Cette solution basée sur Python supprime efficacement le texte barré des PDF en tirant parti des atouts des bibliothèques pdf2docx, python-docx et docx2pdf. En convertissant le PDF en DOCX, en modifiant le DOCX et en le reconvertissant en PDF, nous pouvons garantir que le texte barré est supprimé sans affecter les autres contenus. Cette approche fournit une méthode robuste et efficace pour gérer le texte barré dans les PDF, rendant vos documents propres et professionnels.






Source link