Конвертируем изображения в PDF

altНедавно, в одном из моих проектов понадобилось реализовать возможность конвертировать набор изображений в один PDF-файл…

Я начал рассматривать различные варианты реализации:

1) Проанализировать формат PDF и напрямую формировать документ.

Данный вариант я сразу отбросил так как реализовать нужно было в кратчайшие сроки, а на написание своих классов уйдёт достаточно много времени.

2) Использовать готовые решения.

Я решил пойти именно по этому пути. Для реализации я нашёл огромное число готовых решений для работы с форматом PDF, как платных, так и бесплатных. В данной статье я опишу как реализовать конвертирование папки с изображениями в PDF-файл при помощи пакета SynPDF. Данный пакет мне сразу приглянулся по причине его бесплатности и открытости кода, а также из-за хорошей тех. поддержки.

Итак, первая задача, которую нам нужно решить — это составить список файлов в заданной папке. Решается данная задача вполне легко и тривиально:

Только кодкопировать в буфер обменапечать
procedure ListDir(dir:string; slt: TStrings);
var
f:tsearchrec;
begin
if findfirst(dir+’*.*’,(faanyfile xor fadirectory),f) = 0 then
begin
slt.Add(dir+f.Name);
while findnext(f) = 0 do
slt.Add(dir+f.Name);
findclose(f);
end;
end;
Данная процедура имеет всего два параметра:
dir – Строковый параметр, через который мы будем передавать папку в которой нужно найти все файлы.
slt – Список строк, в который будут сохраняться полные пути на найденные файлы.
Как видите, всё вполне тривиально и просто.
Следующая задача — это непосредственно процесс конвертирования списка изображений в PDF-документ.
Только кодкопировать в буфер обменапечать
procedure PackToPDF(srcdir :string; destPDF: string);
var
pdf: TPdfDocumentGDI;
pdfimgs: TStringList;
i: Integer;
pict: TPicture;
begin
pdf:=TPdfDocumentGDI.Create;
pdfimgs:=TStringList.Create;
pdf.ForceJPEGCompression:=80;
pdf.CompressionMethod:=cmFlateDecode;
ListDir(srcdir,pdfimgs);
pict:= TPicture.Create;
for i := 0 to pdfimgs.Count — 1 do
begin
pict.LoadFromFile(pdfimgs[i]);
with pdf.AddPage do
begin
PageWidth:=Round(pict.Width *0.75);
PageHeight:=Round(pict.Height * 0.75);
end;
pdf.VCLCanvas.Draw(0,0,pict.Graphic);
Application.ProcessMessages;
end;
pdf.SaveToFile(destPDF);
pict.Free;
pdfimgs.Free;
pdf.Free;
end;
Данная процедура имеет два параметра для вызова:
srcdir — строковый параметр, через который мы будем передавать в подпрограмму папку с изображениями для конвертации.
destpdf — строковый параметр, через который мы передадим путь и имя PDF-файла в который будут сохранены изображения из папки srcdir

В данной процедуре мы сначала формируем список файлов для обработки, используя ранее описанную процедуру ListDir, затем по очереди загружаем каждое изображение из списка и отрисовываем его на новом листе в PDF-документе. После всех проделанных действий мы сохраняем готовый PDF-документ и уничтожаем все объекты.
В данной статье я специально подробно не описывал каждое свойство и метод в пакете SynPdf, т.к. их там много и они уже неплохо описаны непосредственно в исходном коде самого пакета. Также, добавлю что данный пакет является очень удобным и, в силу своей бесплатности, является очень хорошим средством для решения проблем связанных с созданием PDF-документов.

Понравилась статья? Поделиться с друзьями: