img2pdf python pdf

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:

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")