web-dev-qa-db-fra.com

Créer PDF à partir d'une liste d'images

Existe-t-il un moyen pratique de créer un PDF à partir d'une liste de fichiers images, en utilisant Python?

En Perl, je sais ce module . Je peux ainsi créer un PDF en seulement 3 lignes:

use PDF::FromImage;
...
my $pdf = PDF::FromImage->new;
$pdf->load_images(@allPagesDir);
$pdf->write_file($bookName . '.pdf');

Je dois faire quelque chose de très similaire à cela, mais en Python. Je connais le module pyPdf , mais j'aimerais quelque chose de simple.

@ Edit

Si vous êtes passé par Google, voici le code:

from fpdf import FPDF
from PIL import Image
def makePdf(pdfFileName, listPages, dir = ''):
    if (dir):
        dir += "/"

    cover = Image.open(dir + str(listPages[0]) + ".jpg")
    width, height = cover.size

    pdf = FPDF(unit = "pt", format = [width, height])

    for page in listPages:
        pdf.add_page()
        pdf.image(dir + str(page) + ".jpg", 0, 0)

    pdf.output(dir + pdfFileName + ".pdf", "F")
47
Macabeus

Installer FPDF pour Python :

pip install fpdf

Maintenant, vous pouvez utiliser la même logique:

from fpdf import FPDF
pdf = FPDF()
# imagelist is the list with all image filenames
for image in imagelist:
    pdf.add_page()
    pdf.image(image,x,y,w,h)
pdf.output("yourfile.pdf", "F")

Vous pouvez trouver plus d'informations sur la page du tutoriel ou la documentation officielle .

49
Ilya Vinnichenko

Si vous utilisez Python 3, vous pouvez utiliser le python module img2pdf

installez-le en utilisant pip3 install img2pdf et vous pouvez l’utiliser dans un script en utilisant import img2pdf

exemple de code

import os
import img2pdf

with open("output.pdf", "wb") as f:
    f.write(img2pdf.convert([i for i in os.listdir('path/to/imageDir') if i.endswith(".jpg")]))
20

La meilleure méthode pour convertir plusieurs images en PDF que j'ai essayé jusqu'ici est d'utiliser purement PIL. C'est assez simple mais puissant:

from PIL import Image

im1 = Image.open("/Users/Apple/Desktop/bbd.jpg")
im2 = Image.open("/Users/Apple/Desktop/bbd1.jpg")
im3 = Image.open("/Users/Apple/Desktop/bbd2.jpg")
im_list = [im2,im3]

pdf1_filename = "/Users/Apple/Desktop/bbd1.pdf"

im1.save(pdf1_filename, "PDF" ,resolution=100.0, save_all=True, append_images=im_list)

Il suffit de définir save_all à True et append_images à la liste des images que vous souhaitez ajouter.

Vous pourriez rencontrer le AttributeError: 'JpegImageFile' object has no attribute 'encoderinfo'. La solution est ici Erreur lors de l'enregistrement de plusieurs fichiers JPEG au format PDF de plusieurs pages

Remarque: Installez le dernier PIL pour vous assurer que save_all argument est disponible pour PDF.

15
billphilip22

Que dis-tu de ça??

from fpdf import FPDF
from PIL import Image
import glob
import os


# set here
image_directory = '/path/to/imageDir'
extensions = ('*.jpg','*.png','*.gif') #add your image extentions
# set 0 if you want to fit pdf to image
# unit : pt
margin = 10

imagelist=[]
for ext in extensions:
    imagelist.extend(glob.glob(os.path.join(image_directory,ext)))

for imagePath in imagelist:
    cover = Image.open(imagePath)
    width, height = cover.size

pdf = FPDF(unit="pt", format=[width + 2*margin, height + 2*margin])
pdf.add_page()

pdf.image(imagePath, margin, margin)

destination = os.path.splitext(imagePath)[0]
pdf.output(destination + ".pdf", "F")
3
Daisuke Harada

pgmagick est une liaison GraphicsMagick(Magick++) pour Python.

C'est un Python pour pour ImageMagick (ou GraphicsMagick ).

import os
from os import listdir
from os.path import isfile, join 
from pgmagick import Image

mypath = "\Images" # path to your Image directory 

for each_file in listdir(mypath):
    if isfile(join(mypath,each_file)):
        image_path = os.path.join(mypath,each_file)
        pdf_path =  os.path.join(mypath,each_file.rsplit('.', 1)[0]+'.pdf')
        img = Image(image_path)
        img.write(pdf_path)

Sample input Image:

enter image description here

PDF looks like this:

enter image description here

instructions d’installation de pgmagick pour Windows:

1) Téléchargez les packages binaires précompilés à partir de Fichiers binaires Windows non officiels pour Python) (comme indiqué dans la page Web pgmagick) et installez-le.

Remarque: Essayez de télécharger la version correcte correspondant à votre version de python installée sur votre ordinateur, que ce soit en 32 bits ou en 64 bits).

Vous pouvez vérifier si vous avez 32 bits ou 64 bits python) en tapant simplement python sur votre terminal et appuyez sur Entrée ..

D:\>python
ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.

Donc il a python version 2.7 Et son de 32 bit (Intel)] on win32 donc vous devez télécharger et installer pgmagick‑0.5.8.win32‑py2.7.exe.

Ce sont les suivants disponibles Python Extensions pour pgmagick :

  • pgmagick ‑ 0.5.8.win ‑ AMD64 – py2.6.exe
  • pgmagick ‑ 0.5.8.win ‑ AMD64 – py2.7.exe
  • pgmagick ‑ 0.5.8.win ‑ AMD64 – py3.2.exe
  • pgmagick ‑ 0.5.8.win32 – py2.6.exe
  • pgmagick ‑ 0.5.8.win32 – py2.7.exe
  • pgmagick ‑ 0.5.8.win32 – py3.2.exe

2) Ensuite, vous pouvez suivre les instructions d’installation de ici .

pip install pgmagick

Puis essayez de l’importer.

>>> from pgmagick import gminfo
>>> gminfo.version
'1.3.x'
>>> gminfo.library
'GraphicsMagick'
>>>
3
Tanveer Alam
**** Convert images files to pdf file.****
from os import listdir
from fpdf import FPDF

path = "/home/bunny/images/" # get the path of images

imagelist = listdir(path) # get list of all images

pdf = FPDF('P','mm','A4') # create an A4-size pdf document 

x,y,w,h = 0,0,200,250

for image in imagelist:

    pdf.add_page()
    pdf.image(path+image,x,y,w,h)

pdf.output("images.pdf","F")
2
user7384403

Je sais que la question a été résolue, mais une autre façon de résoudre ce problème consiste à utiliser la bibliothèque d'oreillers. Pour convertir un répertoire entier d'images:

from PIL import Image
import os


def makePdf(imageDir, SaveToDir):
     '''
        imageDir: Directory of your images
        SaveToDir: Location Directory for your pdfs
    '''
    os.chdir(imageDir)
    try:
        for j in os.listdir(os.getcwd()):
            os.chdir(imageDir)
            fname, fext = os.path.splitext(j)
            newfilename = fname + ".pdf"
            im = Image.open(fname + fext)
            if im.mode == "RGBA":
                im = im.convert("RGB")
            os.chdir(SaveToDir)
            if not os.path.exists(newfilename):
                im.save(newfilename, "PDF", resolution=100.0)
    except Exception as e:
        print(e)

imageDir = r'____' # your imagedirectory path
SaveToDir = r'____' # diretory in which you want to save the pdfs
makePdf(imageDir, SaveToDir)

Pour l'utiliser sur une seule image:

From PIL import Image
import os

filename = r"/Desktop/document/dog.png"
im = Image.open(filename)
if im.mode == "RGBA":
    im = im.convert("RGB")
new_filename = r"/Desktop/document/dog.pdf"
if not os.path.exists(new_filename):
    im.save(new_filename,"PDF",resolution=100.0)
1
Vaibhav Singh

J'ai eu le même problème, alors j'ai créé une fonction python pour unir plusieurs images en un seul fichier PDF. Le code (disponible à partir de ma page github) , utilise reportlab, et est basé sur les réponses des liens suivants:

Voici un exemple de la manière dont les images sont unifiées en pdf:

Nous avons le dossier "D:\pictures" avec des images de types png et jpg, et nous voulons créer un fichier pdf_with_pictures.pdf et les sauvegarder dans le même dossier.

outputPdfName = "pdf_with_pictures"
pathToSavePdfTo = "D:\\pictures"
pathToPictures = "D:\\pictures"
splitType = "none"
numberOfEntitiesInOnePdf = 1
listWithImagesExtensions = ["png", "jpg"]
picturesAreInRootFolder = True
nameOfPart = "volume"

unite_pictures_into_pdf(outputPdfName, pathToSavePdfTo, pathToPictures, splitType, numberOfEntitiesInOnePdf, listWithImagesExtensions, picturesAreInRootFolder, nameOfPart)
0
Valeriy Ivanov

Quelques modifications pour faire un pdf depuis le répertoire où se trouvent les fichiers

Je prends le code et fait quelques légers changements pour le rendre utilisable tel quel.

from fpdf import FPDF
from PIL import Image
import os # I added this and the code at the end

def makePdf(pdfFileName, listPages, dir=''):
    if (dir):
        dir += "/"

    cover = Image.open(dir + str(listPages[0]))
    width, height = cover.size

    pdf = FPDF(unit="pt", format=[width, height])

    for page in listPages:
        pdf.add_page()
        pdf.image(dir + str(page), 0, 0)

    pdf.output(dir + pdfFileName + ".pdf", "F")


# this is what I added
x = [f for f in os.listdir() if f.endswith(".jpg")]
y = len(x)

makePdf("file", x)
0
Giovanni Python