IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Découper un pdf


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Découper un pdf
    Bonjour,

    je souhaiterais pourvoir dissocier un fichier PDF en plusieurs fichiers.
    sur ce PDF il y a de nombreuses factures et donc je souhaiterais découper ce fichier pour chacune des factures, qu'elles fassent 1 ou x pages. et récupérer dans un string le numéro de la facture pour l'insérer dans une variable.
    Puis enregistrer facture dans un pdf unique et lui donner son numero comme nom de fichier, et ce pour chacune des factures.
    Pourriez-vous me conseiller s'il vous plait ? Un tuto par exemple.

    J'ai regardé ce tuto : https://www.thepythoncode.com/code/s...iles-in-python
    Mais le programme fourni dans ce tuto ne fonctionne pas.

    J'ai python 3.10 et ai téléchargé la dernière version de pikepdf.


    Vous en remerciant par avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Au boulot, on m'a demandé récemment d'étudier PikePDF et je lui ai préféré PyMuPDF.

    Pour nos besoins, j'ai fait un wheel (package) qui fait de la recherche de texte dans des fichiers PDF en asychrone. PyMuPDF pourrait t'être utile pour rechercher les numéros de factures.

    Il permet aussi d'extraire des pages. Alors, nativement, je ne suis pas certain ni persuadé qu'il peut de lui même créer un nouveau PDF pour y stocker une facture complète mais sachant qu'il peut ajouter une page à un PDF existant, tu pourrais partir d'un PDF "modèle" avec une page vide, insérer les pages de ta facture dedans et juste supprimer la page vide pour avoir ton document complet.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci Arioch,

    j'ai en effet installé PyMuPDF pour récupérer le numéro de facture dans une variable pour l'utiliser ensuite.
    Pour l'instant, ce simple programme qui est donné, ne fonctionne pas, alors que j'ai installé tout ce qu'il demande. Je ne comprends ou est le soucis.
    La version de python semble être prise en charge et la librairie a été installée sans problème.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Montre ton code entre balises ## stp

  5. #5
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    import os
    from pikepdf import Pdf
     
    # a dictionary mapping PDF file to original PDF's page range
    file2pages = {
        0: [0, 9], # 1st splitted PDF file will contain the pages from 0 to 9 (9 is not included)
        1: [9, 11], # 2nd splitted PDF file will contain the pages from 9 (9 is included) to 11
        2: [11, 100], # 3rd splitted PDF file will contain the pages from 11 until the end or until the 100th page (if exists)
    }
     
    # the target PDF document to split
    filename = "bert-paper.pdf"
    # load the PDF file
    pdf = Pdf.open(filename)
    # make the new splitted PDF files
    new_pdf_files = [ Pdf.new() for i in file2pages ]
    # the current pdf file index
    new_pdf_index = 0
    # iterate over all PDF pages
    for n, page in enumerate(pdf.pages):
        if n in list(range(*file2pages[new_pdf_index])):
            # add the `n` page to the `new_pdf_index` file
            new_pdf_files[new_pdf_index].pages.append(page)
            print(f"[*] Assigning Page {n} to the file {new_pdf_index}")
        else:
            # make a unique filename based on original file name plus the index
            name, ext = os.path.splitext(filename)
            output_filename = f"{name}-{new_pdf_index}.pdf"
            # save the PDF file
            new_pdf_files[new_pdf_index].save(output_filename)
            print(f"[+] File: {output_filename} saved.")
            # go to the next file
            new_pdf_index += 1
            # add the `n` page to the `new_pdf_index` file
            new_pdf_files[new_pdf_index].pages.append(page)
            print(f"[*] Assigning Page {n} to the file {new_pdf_index}")
     
    # save the last PDF file
    name, ext = os.path.splitext(filename)
    output_filename = f"{name}-{new_pdf_index}.pdf"
    new_pdf_files[new_pdf_index].save(output_filename)
    print(f"[+] File: {output_filename} saved.")

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Tu disais avoir installé PyMuPDF.

    C'est du code avec PyMuPDF que je te demandais en fait

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import fitzimport re
    doc = fitz.open("d:/temp/factures.pdf")
    print('nb pages : ' + str(doc.page_count))
    x=0
    for page in doc:
        text = page.get_text()
        result = re.search(r'^Total[\r\n]+(.*)$',text,flags=re.MULTILINE)
        print(result.group(1))
        numfacture = result.group(1)
        doc2 = fitz.open()  # on crée un nouveau PDF
        doc2.insert_pdf(doc,from_page=x,to_page=x)
        doc2.save('d:/temp/'+ 'facture_'+ numfacture + '.pdf')     x += 1
    Il n'y a pas la possibilité d'avoir le nombre de pages du PDF et d'utiliser ces lignes ci-dessous afin de ne plus avoir de boucle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    n = doc.page_count
    doc2.insert_pdf(doc,from_page=0,to_page=n)
    ou au moins à la rigueur utiliser enumerate
    La partie importante ici serait la méthode insert_pdf qui permettrait d'enregistrer d'un numéro de page à un autre.

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il n'y a pas la possibilité d'avoir le nombre de pages du PDF et d'utiliser ces lignes ci-dessous afin de ne plus avoir de boucle ?
    je n'ai pas bien compris ta remarque : il veut extraire chaque facture du pdf dans un pdf différent avec le numéro de la facture dans le nom du fichier.

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    je n'ai pas bien compris ta remarque : il veut extraire chaque facture du pdf dans un pdf différent avec le numéro de la facture dans le nom du fichier.
    Ah ok, j'avais pas bien compris effectivement, par contre je garde la partie enumerate valide pour remplacer ta variable x.

  10. #10
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Ah ok, j'avais pas bien compris effectivement, par contre je garde la partie enumerate valide pour remplacer ta variable x.
    merci du renseignement. Moi qui ne suis pas un pro du python, cela m'a permis de découvrir la fonction enumerate. Si j'ai bien assimilé, mon code peut devenir avec cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import fitz
    import re
    doc = fitz.open("d:/temp/factures.pdf")
    print('nb pages : ' + str(doc.page_count))
    for x,page in enumerate(doc,start=0):
        text = page.get_text()
        result = re.search(r'^Total[\r\n]+(.*)$',text,flags=re.MULTILINE)
        print(result.group(1))
        numfacture = result.group(1)
        doc2 = fitz.open()  # on crée un nouveau PDF
        doc2.insert_pdf(doc,from_page=x,to_page=x)
        doc2.save('d:/temp/'+ 'facture_'+ numfacture + '.pdf')

  11. #11
    Invité
    Invité(e)
    Par défaut
    superbe. Merci a tous.
    Je vais tester tout cela.

    concernant le découpage du pdf par facture.
    Comment puis je faire si il y a pour certaines factures, plusieurs pages ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. macro pour découper un fichier pdf sous excel
    Par jibdu94 dans le forum Général VBA
    Réponses: 1
    Dernier message: 18/05/2011, 23h00
  2. Découper un PDF
    Par aragorn88 dans le forum Général Java
    Réponses: 0
    Dernier message: 10/02/2010, 17h11
  3. Découper une zone dans un PDF
    Par dranakan dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 20/02/2009, 15h45
  4. [C#.Net] Comment découper un fichier pdf en pages
    Par Sidi-Bou dans le forum ASP.NET
    Réponses: 1
    Dernier message: 29/10/2007, 11h37
  5. Découper un pdf
    Par Oberown dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 02/11/2005, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo