2014-12-06 6 views
15

Есть ли какой-либо практический способ создания PDF-файла из списка файлов изображений с использованием Python?Создать PDF из списка изображений

In Perl Я знаю that module. С его помощью я могу создать PDF всего за 3 строк:

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

мне нужно сделать что-то очень похожее на это, но в Python. Я знаю модуль pyPdf, но мне хотелось бы что-то простое.

@Edit

Если вы пришли через 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

Можете ли вы удалить часть ответа из своего вопроса и разместить его правильно, в качестве отдельного ответа? – usr2564301

ответ

18

Установка FPDF for 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") 

Вы можете найти дополнительную информацию at the tutorial page или official documentation.

+0

Спасибо, но я не смог добиться успеха. Изображения, над которыми я работаю, - JPG; FDPF не имеет встроенной поддержки JPG. Для этого нужен PIL. Поскольку PIL больше не поддерживает Python 3, я установил PILLOW. Однако FDPF, по-видимому, не признает: «PIL не установлен». В целях тестирования, я тестировал с изображениями PNG, однако, приводит к следующей ошибке: «Не файл PNG: 0.png» – Macabeus

+0

@KeplerBR. В моем ответе хорошо выше. Я использовал 'pgmagick ', который поддерживает' jpg, png, JPEG 2000' и ​​многие другие форматы и результаты, отличные по сравнению с конвертированием изображений в PDF. –

+0

Что замечательно! Через несколько месяцев я решил вернуться к проекту, который дал мне эту проблему, и снова попытался использовать FPDF, теперь с последней версией, и теперь отлично работает! Спасибо! Я редактировал оригинальный пост с полным кодом, для тех, кто приходит сюда через Google. – Macabeus

2

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: 

enter image description here

PDF looks like this: 

enter image description here

pgmagick инструкция iinstallation для окон:

1) Скачать скомпилированные двоичные пакеты от Unofficial Windows Binaries for Python Extension Packages (как указано на веб-странице pgmagick) и установить его.

Примечание: Попробуйте загрузить правильную версию, соответствующую вашей версии python, установленной на вашем компьютере, и ее 32-битную установку или 64-битную.

Вы можете проверить, есть ли у вас 32- или 64-битную питон, просто набрав питона на терминале и нажмите 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, так что вы должны downlad и установить 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.обоюдного 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) Затем вы можете следовать инструкциям по установке от here.

pip install pgmagick 

Затем попробуйте импортировать его.

>>> from pgmagick import gminfo 
>>> gminfo.version 
'1.3.x' 
>>> gminfo.library 
'GraphicsMagick' 
>>> 
+0

Я видел ваш ответ, но я не могу сделать установку ImageMagick. Когда я пытаюсь установить модуль, я всегда получаю сообщение об ошибке «Magick ++ не найден». Я попытался установить двоичные файлы. Похоже, что он был успешно установлен, но, похоже, не вступает в силу. Мне действительно нужно установить поверх источника? Или я что-то не так? – Macabeus

+0

@KeplerBR Какую операционную систему вы используете? Да, я знаю, что MagiC++ - это зависимость, требуемая для установки pgmagick, но ее стоит того, потому что во многих случаях это потрясающе. –

+0

Моя ОС - Windows 7 – Macabeus

1

Как насчет этого ??

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


# set here 
image_directory = '/path/to/imageDir' 
extensions = ('*.jpg','*.png','*.gif') 
# 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") 
0

Некоторые изменения, чтобы сделать 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) 
8

Если вы используете Python 3, вы можете использовать модуль 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")])) 
0

У меня была такая же проблема, поэтому я создал функцию python для объединения нескольких изображений в один PDF-файл. Код (доступный от my github page, использует 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) 
+0

Если у вас есть новый вопрос, обратитесь к нему, нажав кнопку [Ask Question] (https://stackoverflow.com/questions/ask). Включите ссылку на этот вопрос, если это поможет обеспечить контекст. - [Из обзора] (/ review/low-quality-posts/17547199) –

+0

Это не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав [Ask Question] (https://stackoverflow.com/questions/ask). Вы также можете [добавить щедрость] (https://stackoverflow.com/help/privileges/set-bounties), чтобы привлечь больше внимания к этому вопросу, как только у вас будет достаточно [репутации] (https://stackoverflow.com/help/ Что-репутация). - [Из обзора] (/ review/low-quality-posts/17547199) – Pop

1

Лучший способ для преобразования нескольких изображений в 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'.Решение здесь Error while saving multiple JPEGs as a multi-page PDF

Примечание: Установите новейшую PIL, чтобы убедиться, что save_all аргумент доступен для PDF.

1
**** 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") 
Смежные вопросы