python - img2pdf - Crear PDF a partir de una lista de imágenes
(9)
¿Hay alguna forma práctica de crear un PDF a partir de una lista de archivos de imágenes, usando Python?
En Perl conozco ese módulo . Con él puedo crear un PDF en solo 3 líneas:
use PDF::FromImage;
...
my $pdf = PDF::FromImage->new;
$pdf->load_images(@allPagesDir);
$pdf->write_file($bookName . ''.pdf'');
Necesito hacer algo muy similar a esto, pero en Python. Conozco el módulo pyPdf , pero me gustaría algo simple.
@Editar
Si llegó a través de Google, aquí está el código:
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")
Algunos cambios para hacer un pdf desde el directorio donde están los archivos
Tomé el código e hice un pequeño cambio para que sea utilizable tal como está.
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)
¿¿Qué tal esto??
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")
El mejor método para convertir múltiples imágenes a PDF que he probado hasta ahora es usar
PIL
puramente.
Es bastante simple pero poderoso:
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)
Simplemente configure
save_all
en
True
y
append_images
a la lista de imágenes que desea agregar.
Puede encontrar el
AttributeError: ''JpegImageFile'' object has no attribute ''encoderinfo''
.
La solución está aquí
Error al guardar múltiples archivos JPEG como PDF de varias páginas
Nota: Instale el
PIL
más reciente para asegurarse de que el argumento
save_all
esté disponible para PDF.
Instale FPDF para Python :
pip install fpdf
Ahora puedes usar la misma lógica:
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")
Puede encontrar más información en la página del tutorial o en la documentación oficial .
Sé que la pregunta ha sido respondida, pero una forma más de resolver esto es usar la biblioteca de almohadas. Para convertir un directorio completo de imágenes:
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)
Para usarlo en una sola imagen:
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)
Si usa Python 3, puede usar el módulo python img2pdf
instálelo usando
pip3 install img2pdf
y luego puede usarlo en un script usando
import img2pdf
Código de muestra
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")]))
Tuve el mismo problema, así que creé una función de python para unir varias imágenes en un pdf.
El código (disponible en
mi página de github
, usa
reportlab
, y se basa en las respuestas de los siguientes enlaces:
- Crear PDF a partir de una lista de imágenes
- Combinando múltiples pngs en un solo pdf en python
- imágenes png a un pdf en python
- ¿Cómo puedo convertir todos los archivos JPG de una carpeta a PDF y combinarlos?
- https://www.blog.pythonlibrary.org/2012/01/07/reportlab-converting-hundreds-of-images-into-pdfs/
Aquí hay un ejemplo de cómo unir imágenes en pdf:
Tenemos la carpeta "D: / pictures" con imágenes de los tipos png y jpg, y queremos crear el archivo pdf_with_pictures.pdf y guardarlo en la misma carpeta.
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)
pgmagick
es un
pgmagick
GraphicsMagick(Magick++)
para Python.
Es un contenedor de Python para ImageMagick (o 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:
Instrucciones de instalación de pgmagick para Windows:
1) Descargue paquetes binarios precompilados de los binarios no oficiales de Windows para paquetes de extensión de Python (como se menciona en la página web pgmagick) e instálelo.
Nota: Intente descargar la versión correcta correspondiente a su versión de Python instalada en su máquina y ya sea su instalación de 32 bits o 64 bits.
Puede verificar si tiene python de 32 bits o de 64 bits simplemente escribiendo python en su terminal y presione Entrar.
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.
Por lo tanto, tiene la
python version 2.7
y es de
32 bit (Intel)] on win32
por lo que debe descargar e instalar
pgmagick‑0.5.8.win32‑py2.7.exe
.
Estos son los siguientes paquetes de extensión Python disponibles para 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) Luego puede seguir las instrucciones de instalación desde pgmagick .
pip install pgmagick
Luego intente importarlo.
>>> 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")