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")
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 .
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")]))
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.
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")
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:
PDF looks like this:
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 :
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'
>>>
**** 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")
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)
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)
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)