web-dev-qa-db-fra.com

Conversion de PDF en images automatiquement

Donc, l'état dans lequel je suis a publié un tas de données sous forme PDF, mais pour aggraver les choses, la plupart (tous?) Des PDF semblent être des lettres tapées dans Office, imprimées/fax , puis numérisé (notre gouvernement à son meilleur hein?). Au début, je pensais que j'étais fou, mais ensuite j'ai commencé à voir de nombreux fichiers PDF qui sont "inclinés", comme si quelqu'un ne les avait pas correctement sur le scanner. Donc, je a pensé que la meilleure chose à faire pour en extraire le texte réel serait de transformer chaque page en image.

Évidemment, cela doit être automatisé, et je préfère m'en tenir à Python si possible. Si Ruby ou Perl ont une forme d'implémentation qui est tout simplement trop génial) pour laisser passer, je peux emprunter cette voie. J'ai essayé pyPDF pour l'extraction de texte, cela ne m'a évidemment pas fait beaucoup de bien. J'ai essayé swftools, mais les images que je reçois qui sont juste timides de complètement inutilisables . Il semble que les polices soient ruinées lors de la conversion. Je ne me soucie même pas vraiment du format d'image à la sortie, tant qu'elles sont relativement légères et lisibles.

31
f4nt

Si les fichiers PDF sont vraiment des images numérisées, vous ne devez pas convertir le PDF en image, vous devez extraire l'image du PDF. Très probablement, toutes les données dans le PDF est essentiellement une image géante, enveloppée dans PDF verbosité pour la rendre lisible dans Acrobat.

Vous devriez essayer l'expédient simple de trouver simplement l'image dans le PDF et de copier les octets: Extraire les JPG des PDF . Le code est simple, et il y a probablement des dizaines de raisons pour lesquelles il ne fonctionnera pas sur vos fichiers PDF. Mais si c'est le cas, vous aurez un moyen rapide et indolore d'obtenir le les données d'image des fichiers PDF.

12
Ned Batchelder

Vous pourriez appeler par exemple pdftoppm depuis la ligne de commande (ou en utilisant le module subprocess de Python), puis convertissez les fichiers PPM) résultants au format souhaité en utilisant par exemple ImageMagick (encore une fois, en utilisant subprocess ou certaines liaisons si elles existent).

8
Antoine P.

Ghostscript est idéal pour convertir des fichiers PDF en images. Il est fiable et possède de nombreuses options configurables. Il est également disponible sous licence GPL ou licence commerciale. Vous pouvez l'appeler à partir de la ligne de commande ou utiliser son API native. Pour plus d'informations:

5
Scott Willeke

Voici une approche alternative pour transformer un fichier .pdf en images: Utilisez une imprimante d'images. J'ai utilisé avec succès la fonction ci-dessous pour "imprimer" des fichiers pdf en jpeg avec ImagePrinter Pro . Cependant, il existe de nombreuses imprimantes d'image. Choisissez celui que vous aimez. Une partie du code devra peut-être être légèrement modifiée en fonction de l'imprimante d'image choisie et du format d'enregistrement de fichier standard utilisé par l'imprimante d'image.

import win32api
import os

def pdf_to_jpg(pdfPath, pages):
    # print pdf using jpg printer
    # 'pages' is the number of pages in the pdf
    filepath = pdfPath.rsplit('/', 1)[0]
    filename = pdfPath.rsplit('/', 1)[1]

    #print pdf to jpg using jpg printer
    tempprinter = "ImagePrinter Pro"
    printer = '"%s"' % tempprinter
    win32api.ShellExecute(0, "printto", filename, printer,  ".",  0)

    # Add time delay to ensure pdf finishes printing to file first
    fileFound = False
    if pages > 1:
        jpgName = filename.split('.')[0] + '_' + str(pages - 1) + '.jpg'
    else:
        jpgName = filename.split('.')[0] + '.jpg'
    jpgPath = filepath + '/' + jpgName
    waitTime = 30
    for i in range(waitTime):
        if os.path.isfile(jpgPath):
            fileFound = True
            break
        else:
            time.sleep(1)

    # print Error if the file was never found
    if not fileFound:
        print "ERROR: " + jpgName + " wasn't found after " + str(waitTime)\
              + " seconds"

    return jpgPath

La variable jpgPath résultante vous indique l'emplacement du chemin de la dernière page jpeg du pdf imprimé. Si vous avez besoin d'obtenir une autre page, vous pouvez facilement ajouter de la logique pour modifier le chemin d'accès aux pages précédentes

1
Jed