Создать PDF из списка изображений
Есть ли какой-либо практический способ создания PDF файла из списка файлов изображений, используя Python?
В Perl я знаю этот модуль. С его помощью я могу создать PDF всего в 3 строках:
use PDF::FromImage;
...
my $pdf = PDF::FromImage->new;
$pdf->load_images(@allPagesDir);
$pdf->write_file($bookName . '.pdf');
Мне нужно сделать что-то очень похожее на это, но на Python. Я знаю модуль pyPdf, но мне бы хотелось что-то простое.
@Редактировать
Если вы пришли через Google, вот код:
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")
Ответы
Ответ 1
Установите FPDF для Python:
pip install fpdf
Теперь вы можете использовать ту же логику:
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")
Дополнительную информацию вы можете найти на странице руководства или официальной документации.
Ответ 2
Если вы используете Python 3, вы можете использовать модуль python img2pdf
установите его, используя pip3 install img2pdf
а затем вы можете использовать его в скрипте с использованием import img2pdf
образец кода
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")]))
Ответ 3
Лучший способ конвертировать несколько изображений в PDF, который я пробовал до сих пор, - использовать чисто PIL
. Это довольно просто, но мощно:
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)
Просто установите для save_all
значение True
и append_images
в список изображений, которые вы хотите добавить.
Вы можете столкнуться с AttributeError: 'JpegImageFile' object has no attribute 'encoderinfo'
. Решение здесь - ошибка при сохранении нескольких JPEG в виде многостраничного PDF
Примечание. Установите новейший PIL
чтобы убедиться, что аргумент save_all
доступен для PDF.
Ответ 4
Как насчет этого??
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")
Ответ 5
pgmagick - привязка GraphicsMagick(Magick++)
для Python.
Это оболочка Python для ImageMagick (или 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:
инструкция pgmagick iinstallation для окон:
1) Загрузите предварительно скомпилированные бинарные пакеты из неофициальных бинарных файлов Windows для пакетов расширения Python (как указано на веб-странице pgmagick) и установите его.
Примечание. Попробуйте загрузить правильную версию, соответствующую вашей версии python, установленной на вашем компьютере, и установить ее 32-битную или 64-битную.
Вы можете проверить, есть ли у вас 32-битный или 64-битный питон, просто набрав python на вашем терминале и нажмите Enter.
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.
Таким образом, у него есть python version 2.7
и ее 32 bit (Intel)] on win32
поэтому вам нужно будет свернуть и установить pgmagick‑0.5.8.win32‑py2.7.exe
.
Это следующие доступные пакеты расширения Python для 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) Затем вы можете следовать инструкциям по установке из здесь.
pip install pgmagick
Затем попробуйте импортировать его.
>>> from pgmagick import gminfo
>>> gminfo.version
'1.3.x'
>>> gminfo.library
'GraphicsMagick'
>>>
Ответ 6
**** 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")
Ответ 7
Я знаю, что на вопрос был дан ответ, но еще один способ решить эту проблему - использовать библиотеку подушек. Чтобы преобразовать весь каталог изображений:
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)
Для использования на одном изображении:
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)
Ответ 8
Некоторые изменения для создания PDF файла из каталога, где находятся файлы.
Я беру код и делаю некоторые небольшие изменения, чтобы сделать его пригодным для использования, как есть.
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)
Ответ 9
У меня была та же проблема, поэтому я создал функцию python для объединения нескольких изображений в один PDF файл. Код (доступный с моей страницы github, использует reportlab
, и основан на ответах из следующих ссылок:
Вот пример того, как объединить изображения в pdf:
У нас есть папка "D:\pictures" с картинками типов png и jpg, и мы хотим создать файл pdf_with_pictures.pdf из них и сохранить его в той же папке.
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)