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 :

Diviser un pdf avec pyPDF2


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Par défaut Diviser un pdf avec pyPDF2
    Bonjour à tous,

    Je suis en train d'essayer de diviser un PDF de plusieurs pages afin de le regrouper les pages par une ou deux.
    Une petite explication afin d'être plus clair :
    • Il y a une liste qui comporte toutes les pages du PDF initial : pdf.pages [<page:1>,<page:2>,<page:3>,<page:4>]
    • Il y a une liste qui comporte les premières pages qui devront être avec la suivante lors de la division : two_pages [<page:2>]
    • Il y a une liste qui comporte toutes les premières pages de manière générale : firstPages [<page:1>,<page:2>,<page:4>]


    Je cherche un moyen pour diviser le pdf initial pour que dans notre exemple il sorte 3 PDF :
    • <page:1>
    • <page:2> et <page:3>
    • <page:4>


    Cependant, je n'y arrive pas et je n'arrive pas à comprendre le problème.

    Voici mon code :
    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
     
    from PyPDF2 import PdfFileWriter, PdfFileReader
     
    inputpdf = PdfFileReader(open(path_pdf, "rb"))
     
    for i in firstPages :
    	if i in two_pages :
    		output = PdfFileWriter()
    		output.addPage(inputpdf.getPage(pdf.pages.index(i)))
    		output.addPage(inputpdf.getPage(pdf.pages.index(i)+1))		
    		with open("document-page%s.pdf" % str(pdf.pages.index(i)), "wb") as outputStream:
    	       	     output.write(outputStream)
    	else :
    	    output = PdfFileWriter()
    		output.addPage(inputpdf.getPage(pdf.pages.index(i)+1))
    		with open("document-page%s.pdf" % str(pdf.pages.index(i)), "wb") as outputStream:
    	             output.write(outputStream)
    Je vous remercie pour votre aide.

    Avinetor

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'utilise PyPDF2 qui marche très bien, mais il faudrait monter un exemple bidon simplifié mais suffisamment complet (avec les listes) pour qu'on puisse l'exécuter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Par défaut
    Bonjour Tytamos,

    Merci pour ton retour.
    Voici ce que me donne le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    print(pdf.pages)
    print("Le type de pdf.pages est ", type(pdf.pages))
    print("le type de ", pdf.pages[0], " dans pdf.pages est ", type(pdf.pages[0]))
     
    print(firstPages)
    print("Le type de fistPages est ", type(firstPages))
    print("le type de ", firstPages[0], " dans fistPages est ", type(firstPages[0]))
     
    print(two_pages)
    print("Le type de two_pages est ", type(two_pages))
    print("le type de ", two_pages[0], " dans two_pages est ", type(two_pages[0]))
    [<Page:1>, <Page:2>, <Page:3>, <Page:4>, <Page:5>, <Page:6>, <Page:7>, <Page:8>, <Page:9>, <Page:10>, <Page:11>, <Page:12>, <Page:13>, <Page:14>, <Page:15>]
    Le type de pdf.pages est <class 'list'>
    le type de <Page:1> dans pdf.pages est <class 'pdfplumber.page.Page'>

    [<Page:1>, <Page:2>, <Page:4>, <Page:5>, <Page:7>, <Page:8>, <Page:9>, <Page:10>, <Page:11>, <Page:13>, <Page:14>, <Page:15>]
    Le type de fistPages est <class 'list'>
    le type de <Page:1> dans fistPages est <class 'pdfplumber.page.Page'>

    [<Page:2>, <Page:5>, <Page:11>]
    Le type de two_pages est <class 'list'>
    le type de <Page:2> dans two_pages est <class 'pdfplumber.page.Page'>

    J'utilise en effet pdfplumber pour créer ces listes.

    Bonne journée.

    Avinetor

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Si vous voulez de l'aide, il ne faut pas se contenter de décrire le besoin mais aussi décrire le problème rencontré (message d'erreur, j'obtiens çà en sortie alors que j'attendais...) et fournir un code minimal qui permette de le reproduire.

    "minimal" parce que vous devez être capable de reformuler comment construire par étapes la solution/programme qui y réponde.

    Si vous bloquez dans la réalisation d'une étape particulière, vous allez vous concentrer dessus en écrivant un bout de code minimal qui se contente d'essayer de la réaliser.

    Cette étape là est importante car vous allez pouvoir résumer le problème technique rencontré en quelques mots qui pourront être utiles pour chercher sur Internet.

    Et si vous n'arrivez toujours pas à trouver une solution, vous avez alors un code minimal à poster et une description de problème (indépendante du besoin de départ): une bonne base pour avoir de l'aide.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Par défaut
    Bonjour Wiztricks,

    Merci également pour ton aide.

    Je n'arrive pas à obtenir un message d'erreur mais voici comment j'obtiens l'erreur :
    Avec le fichier en pièce jointe.

    Le code principal :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    # -*- coding: utf-8 -*-
     
    import os
    import pickle
    import pdfplumber
    from PyPDF2 import PdfFileWriter, PdfFileReader
    from losfonctiones import *
     
    path_pdf = "Test.pdf"
    pdf = pdfplumber.open(path_pdf)
    two_pages = []
    matri = []
    salaire = []
     
    print(pdf.pages[0].width)
    print(pdf.pages[0].height)
     
    # On cherche si un nombre est affiché en bas de la page
     
    for page in pdf.pages :
    	paid_crop = page.within_bbox((300, 400, page.width, page.height))
    	paid_chars = paid_crop.extract_text() 	# Trouve le texte du salaire à payer
    	print(paid_chars)
    	print(len(paid_chars))
    	print(type(paid_chars))
    	if len(paid_chars) == 1 :					# S'il n'y a pas de salaire sur la page
    		two_pages.append(page)				# Rajoute le numéro de la page dans la liste "two_pages"
    	else:
    		paid = paid_chars.strip()			# Supprime les espaces avant et après
    print(two_pages)
     
    # Création de la liste des dernières pages
     
    lstpages = list(pdf.pages)
    lastPages = last_page(lstpages,two_pages)
     
    # Création de la liste des premières pages
     
    frstpages = list(pdf.pages)
    firstPages = first_page(frstpages,two_pages)
     
    print(lastPages)
    print(firstPages)
     
    for page in firstPages :
     
    	mat_crop = page.within_bbox((0, 0, 300, 400))
    	mat_chars = mat_crop.extract_text()	# Trouve le texte du matricule
    	mat_double = mat_chars.strip()		# Supprime les espaces avant et après
    	mat = mat_double[::2]				# Supprime une lettre sur deux
    	mat_int = int(mat)
    	matri.append(mat_int)				# Enregistre le matricule dans la liste matri
     
     
    for page in lastPages :
     
    	paid_crop = page.within_bbox((300, 400, page.width, page.height))
    	paid_chars = paid_crop.extract_text() 	# Trouve le texte du salaire à payer
    	paid = paid_chars.strip()
    	paid_float = float((paid))
    	salaire.append(paid_float)
     
    print(matri)
    print(salaire)
     
    inputpdf = PdfFileReader(open(path_pdf, "rb"))
     
    try:
    	for i in firstPages :
    		if i in two_pages :
    			output = PdfFileWriter()
    			output.addPage(inputpdf.getPage(pdf.pages.index(i)))
    			output.addPage(inputpdf.getPage(pdf.pages.index(i)+1))		
    			with open("document-page%s.pdf" % str(pdf.pages.index(i)), "wb") as outputStream:
    		       	output.write(outputStream)
     
    except type_de_l_exception as exception_retournee:
    	print("Voici l'erreur :", exception_retournee)
     
     
    os.system("pause")
    Le fichier losfonctiones.py
    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
     
    # -*- coding: utf-8 -*-
     
    def last_page(totalPages,twoPages):
    	"""Fonction permettant de trouver la dernière page des bulletins de salaire"""
    	for p in twoPages:
    		totalPages.remove(p)
    	return totalPages
     
     
    def first_page(totalPages,twoPages):
    	"""Fonction permettant de trouver la première page des bulletins de salaire"""
    	for p in twoPages:
    		firstpi = totalPages.index(p)
    		lastpi = firstpi + 1
    		del totalPages[lastpi]
    	return totalPages
    Si je mets en commentaire les lignes 74 et 75 du fichier principal, le script se lance mais n'enregistre pas les fichiers pdf divisés.

    Merci pour votre aide.
    N'hésitez pas à me dire comment vous expliquer mieux.

    Cordialement,

    Avinetor
    Images attachées Images attachées

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 65
    Par défaut
    En fait, je viens de trouver la solution...
    Sur mon éditeur de code (Sublime Text) il y a bien une tabulation sur la ligne 75 (en dessous du "with") mais en le copiant/collant sur le forum, j'ai vu qu'il n'y était pas...
    J'en ai juste rajouté un et cela fonctionne.

    N'hésitez pas à me faire un retour sur mon code...

    et merci encore.

    Cordialement,

    Avinetor

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

Discussions similaires

  1. [VB6] Créer un .PDF avec VB ?
    Par Vince dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/07/2005, 14h27
  2. OpenOffice - storeToUrl en PDF avec Delphi
    Par Thomad dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 31/05/2005, 13h38
  3. [CR][.Net] Exportation PDF avec Crystal Report
    Par SoaB dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/05/2005, 13h25
  4. Réponses: 2
    Dernier message: 15/04/2005, 15h51
  5. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 17h33

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