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

PyQt Python Discussion :

Suivi de progression conversion PDF vers Image


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut Suivi de progression conversion PDF vers Image
    Bonjour à tous,

    Suite à mon sujet sur l'avancement d'une tâche (http://www.developpez.net/forums/d14...p-mise-lignne/) que Tyrtamos m'a résolu . Je reviens ici pour demander plus ou moins la même chose.

    J'ai commencé par suivre les conseils de Tyrtamos, si une méthode n'a pas de callback disponible alors il faut en ajoutant une en réécrivant la méthode. Ce que je veux faire c'est suivre la progression d'une conversion d'un PDF en image (ici je n'ai qu'une page, monpdf.pdf[0])

    J'utilise donc Wand et la class Image de wand.image. Dans mon cas je veux suivre la progression lors de la sauvegarde, donc je regarde ici : https://github.com/dahlia/wand/blob/...image.py#L2269

    Je reprend la méthode pour étendre de cette classe (j'ajoute mon paramètre callback à None). Mais le soucis c'est que je ne sais pas quoi faire comme calcul :/ la méthode à l'air pas mal compliqué :/. Pour le coup j'aurais bien tenté de faire un calcul sur le nombre de page mais si j'ai qu'une page à convertir je vais voir la progression de 0 à 100% directement. Et de toute façon il me semble pas que j'ai le nombre de page du document.

    Vous auriez une idée pour arriver à ce que je veux ?

    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
     
    class WandImage(Image):
     
        def save(self, file=None, filename=None, callback=None):
            """Saves the image into the ``file`` or ``filename``. It takes
            only one argument at a time.
            :param file: a file object to write to
            :type file: file object
            :param filename: a filename string to write to
            :type filename: :class:`basestring`
            .. versionadded:: 0.1.5
               The ``file`` parameter.
            .. versionadded:: 0.1.1
            """
            if file is None and filename is None:
                raise TypeError('expected an argument')
            elif file is not None and filename is not None:
                raise TypeError('expected only one argument; but two passed')
            elif file is not None:
                if isinstance(file, string_type):
                    raise TypeError('file must be a writable file object, '
                                    'but {0!r} is a string; did you want '
                                    '.save(filename={0!r})?'.format(file))
                elif isinstance(file, file_types) and hasattr(libc, 'fdopen'):
                    fd = libc.fdopen(file.fileno(), file.mode)
                    if len(self.sequence) > 1:
                        r = library.MagickWriteImagesFile(self.wand, fd)
                    else:
                        r = library.MagickWriteImageFile(self.wand, fd)
                    libc.fflush(fd)
                    if not r:
                        self.raise_exception()
                else:
                    if not callable(getattr(file, 'write', None)):
                        raise TypeError('file must be a writable file object, '
                                        'but it does not have write() method: ' +
                                        repr(file))
                    file.write(self.make_blob())
            else:
                if not isinstance(filename, string_type):
                    raise TypeError('filename must be a string, not ' +
                                    repr(filename))
                filename = encode_filename(filename)
                if len(self.sequence) > 1:
                    r = library.MagickWriteImages(self.wand, filename, True)
                else:
                    r = library.MagickWriteImage(self.wand, filename)
                if not r:
                    self.raise_exception()
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    A mon avis, on n'a aucune information sur la progression de la conversion d'une seule page, parce que cette conversion est un simple appel à une librairie (API de ImageMagick). S'il fallait faire une barre de progression pour faire patienter l'utilisateur, et en considérant que cette conversion dure un temps suffisant pour le justifier (plusieurs secondes), je ne vois pas autre chose qu'une chenille.

    Une barre de progression qui suit l'avancement de la conversion de plusieurs pages me semble plus intéressant, et ce sera plus facile à faire.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse Tyrtamos.

    C'est ce que je pensais (la chenille), même pour plusieurs pages faire une barre de progression est intéressant mais sachant que c'est la même méthode (save) qui est utilisé, on a pas grande informations dedans... On a le nombre de séquence (pour moi c'est le nombre de pages, je me trompe peut-être), mais cette valeur n'est jamais incrémenté, c'est le nombre de pages du document je crois. Je ne vois pas comment faire un calcul avec seulement le nombre de séquence lol.

    Tu connais une autre lib pour convertir PDF vers Image ? (susceptible d'avoir un progression possible)

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Rtransat Voir le message
    Tu connais une autre lib pour convertir PDF vers Image ? (susceptible d'avoir un progression possible)
    J'ai peut-être une idée.

    Pour un de mes programmes, j'utilise un module qui s'appelle PyPDF2 pour rassembler plusieurs centaines de courriers pdf en un seul fichier pdf.

    Mais ce même module est aussi capable de faire le contraire: décomposer un gros pdf en pages.

    Alors, tu pourrais l'utiliser comme ça: décomposer ton pdf en pages et traiter chaque page pdf avec wand pour convertir en image. Tu aurais ainsi une source pour alimenter ta barre de progression: la connaissance dès le départ de la quantité totale de pages à convertir, et la progression par un compteur des pages déjà converties.

    PyPDF2 est un petit module écrit en pur python et facile à installer. Il fonctionne aussi en Python 3 (je l'ai en ce moment avec Python 3.4):
    => https://pypi.python.org/pypi/PyPDF2
    => https://github.com/mstamy2/PyPDF2

    J'ai même communiqué avec les auteurs pour leur témoigner de l'usage que j'en avais, et ils en ont été très intéressés.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse .

    Le truc c'est que là tu parles de convertir plusieurs pages, mais dans mon cas je n'ai que la première page à convertir en image, donc toujours la même chose, pour avoir une progression sur une seule page ça reste possible avec PyPDF2 ?

    Pour le moment voici ce que j'ai dans la méthode run de mon thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def run(self):
            compteur = 0
            input = PdfFileReader(open(self.pdf, 'rb'))
            print(input.getNumPages())
            for page_number in range(0, input.getNumPages() + 1):
                output = self.pdf[:-3] + str(page_number) + ".png"
                with Image(filename=self.pdf + "["+str(page_number)+"]", resolution=self.density) as img:
                    img.save(filename=output)
                compteur += 1
                print(compteur / input.getNumPages())
                self.avancement(compteur / input.getNumPages())
    Maintenant le code avec un condition qui vérifie si on coche "Convert first page only"

    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
     
    def run(self):
            compteur = 0
            if not self.checked:
                input = PdfFileReader(open(self.pdf, 'rb'))
                for page_number in range(1, input.getNumPages() + 1):
                    output = self.pdf[:-3] + str(page_number) + ".png"
                    with Image(filename=self.pdf + "["+str(compteur)+"]", resolution=self.density) as img:
                        img.compression_quality = self.quality
                        img.save(filename=output)
                    compteur += 1
     
                    self.avancement(compteur / input.getNumPages())
            else:
                output = self.pdf[:-3] + "png"
                with Image(filename=self.pdf + "[0]", resolution=self.density) as img:
                    img.compression_quality = self.quality
                    img.save(filename=output)
     
                compteur = 1
                self.avancement(compteur / 1)
    Dans ce cas la barre de progression de progresse pas et ma QProgressDialog reste ouverte jusqu'à ce que je la ferme moi même. Et si je test un pdf avec une seule page et que la case est décoché (donc je me retrouve dans le if) et bien ça à le même comportement que si j'avais coché la case "Convert first page only"

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'avoue que j'arrive au bout de ce que je sais faire sur cette question. D'autant plus que je ne comprends plus très bien ce que tu veux faire:

    Citation Envoyé par Rtransat Voir le message
    mais dans mon cas je n'ai que la première page à convertir en image, donc toujours la même chose, pour avoir une progression sur une seule page ça reste possible avec PyPDF2 ?
    Donc, tu prends un pdf de 50 pages, tu convertis la 1ère page en image et tu retrouves à la fin ton pdf de 50 pages avec la 1ère page en image et les 49 autres pages non modifiées? Je ne comprends pas l'intérêt de la manip, mais ce n'est pas un problème pour moi.

    Le module PyPDF2 sait bien faire 2 choses que les anglo-saxons appellent "split and merge":
    - pour split: on prend un fichier pdf de 50 pages, et on se retrouve après traitement avec 50 fichiers pdf, chaque fichier contenant une page du pdf initial.
    - pour merge: on prend 50 fichiers pdf sur disque et on les regroupe pour retrouver un seul fichier pdf de 50 pages.

    Pour le reste: voir la doc.

    Comme je ne connais pas wand, je ne sais pas s'il sait convertir en image seulement la 1ère page d'un gros pdf. Mais s'il ne sait pas traiter autrement qu'une page isolée, tu peux essayer la méthode suivante:
    - découper ton pdf en "fichiers-pdf-1-page" grâce à PyPDF2 (split)
    - convertir le fichier pdf 1ère page en image
    - reconvertir l'image en pdf (je ne sais pas comment)
    - reconstruire le pdf initial grâce à PyPDF2 (merge).

    Sincèrement, pour afficher la progression d'un bazar pareil, je ne vois guère qu'une chenille...

Discussions similaires

  1. DLL conversion pdf vers image (Jpeg ou png)
    Par mickmix69 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 03/12/2012, 13h08
  2. Réponses: 0
    Dernier message: 23/07/2012, 14h47
  3. PDF vers image (jpg) ?
    Par postb99 dans le forum C#
    Réponses: 1
    Dernier message: 05/02/2009, 09h18
  4. conversion pdf en images
    Par snike dans le forum Autres Logiciels
    Réponses: 9
    Dernier message: 23/12/2007, 17h35
  5. [PDFLib] Conversion PDF vers HTML
    Par soccersoft dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 14/07/2007, 13h05

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