2014-05-17 9 views
0

Je voudrais utiliser le paquetage imagemagick Wand pour convertir toutes les pages d'un fichier pdf en un seul fichier image. J'ai le mal à suivre si (voir commentaires ci-dessous qui problème fort)imagemagick wand enregistrer des pages pdf comme images

import tempfile 
from wand.image import Image 


with file('my_pdf_with_5_pages.png') as f: 
    image = Image(file=f, format='png') 
    save_using_filename(image) 
    save_using_file(image) 

def save_using_filename(image): 
    with tempfile.NamedTemporaryFile() as temp: 
     # this saves all pages, but a file for each page (so 3 files) 
     image.save(filename=temp.name) 

def save_using_file(image): 
    with tempfile.NamedTemporaryFile() as temp: 
     # this only saves the first page as an image 
     image.save(file=temp) 

Mon objectif final pour être en mesure de préciser quelles pages doivent être converties en une image continue. Ceci est possible à partir de la ligne de commande avec un peu de

convert -append input.pdf[0-4] 

mais j'essaye de travailler avec python.

Je vois que nous pouvons obtenir des tranches en faisant ceci:

[x for x in w.sequence[0:1]] # get page 1 and 2 

maintenant sa question de savoir comment se joindre à ces pages ensemble.

Répondre

4

Une légère simplification de la réponse/ajout de @ rikAtee de détecter le nombre de pages automatiquement en comptant la longueur de la séquence:

def convert_pdf_to_png(blob): 
    pdf = Image(blob=blob) 

    pages = len(pdf.sequence) 

    image = Image(
     width=pdf.width, 
     height=pdf.height * pages 
    ) 

    for i in xrange(pages): 
     image.composite(
      pdf.sequence[i], 
      top=pdf.height * i, 
      left=0 
     ) 

    return image.make_blob('png') 

Je ne l'ai pas remarqué des problèmes de liaison mémoire, bien que mes fichiers PDF seulement ont tendance à être 2 ou 3 pages.

+0

merci @Steve. J'ai remarqué la fuite de mémoire après avoir exécuté le code pendant une heure ou deux. Pouvez-vous mettre votre code dans une boucle et rapporter si une fuite de mémoire se produit. Serait bon de savoir :) – rikAtee

1

Note: ce qui provoque une fuite de mémoire

J'ai trouvé un moyen. Il y a probablement un meilleur moyen, mais cela fonctionne.

class Preview(object): 
    def __init__(self, file): 
     self.image = Image(file=file) 

    def join_pages(self, page_count): 
     canvas = self.create_canvas(page_count=page_count) 
     for page_number in xrange(page_count): 
      canvas.composite(
       self.image.sequence[page_number], 
       top=self.image.height*page_number, 
       left=0, 
      ) 

    def create_canvas(self, page_count): 
     return Image(
      width=self.pdf.width, 
      height=self.image.height*page_count, 
     ) 

    preview = Preview(open('path/to/pdf') 
    preview.join_pages(3) 
3

Ma solution:

from wand.image import Image 

diag='yourpdf.pdf' 

with(Image(filename=diag,resolution=200)) as source: 
    images=source.sequence 
    pages=len(images) 
    for i in range(pages): 
     Image(images[i]).save(filename=str(i)+'.png') 

Il fonctionne, et par rapport à d'autres réponses, il semble plus souple à certains fichiers multi-pages pdf avec une taille variable dans différentes pages.

Questions connexes