Часто сгенерированный программой файл формата PDF имеет размер больше, чем нам хотелось бы. Возникает законное желание как-нибудь его уменьшить. Документ формата PDF представляет собой контейнер, который состоит из различных элементов: текст, изображения, шрифты и так далее. Все эти элементы можно сжать, а значит размер PDF файла можно уменьшить.
Рассмотрим уменьшение размера документа в формате PDF на примере работы с Debenu Quick PDF Library, с помощью методов библиотеки и собственными средствами. Библиотека Debenu Quick PDF Library для уменьшения размера документа имеет несколько функций:
У многих PDF-документов большую часть размера файла составляют изображения. А значит единственным способом уменьшить размер такого PDF-документа – это предварительно ухудшить до приемлемого состояния качество изображений. Например, изображения могут иметь большое разрешение, которое можно спокойно уменьшить во много раз и это не скажется на качестве PDF-документа. Можно через параметры программы предоставить пользователю самому определить нужный ему баланс между качеством изображений и размером результирующего файла.
Добавим в класс, который формирует PDF-документ, поля с параметрами:
Таким образом мы видим, что стандартные методы библиотеки Debenu Quick PDF Library почти не могут помочь в уменьшении размера создаваемого файла. Это, я думаю, касается и других подобных библиотек. Поэтому спасти программиста может только индивидуальный контроль различных элементов документа.
Рассмотрим уменьшение размера документа в формате PDF на примере работы с Debenu Quick PDF Library, с помощью методов библиотеки и собственными средствами. Библиотека Debenu Quick PDF Library для уменьшения размера документа имеет несколько функций:
- CompressContent – функция сжимает текстовое содержимое документа. Ее необходимо вызвать после окончания формирования документа. К сожалению, эта функция не дает существенного уменьшения размера файла.
- CompressPage – эта функция аналогична функции CompressContent, но сжимает только выбранную страницу.
- CompressImages – функция позволяет указать, следует ли сжимать добавляемые в документ изображения. Ее нужно вызывать до вызова функций добавления изображений. Сжатию подлежат только изображения, которые добавляются в PDF в несжатом состоянии. А значит есть шанс, что размер уменьшится при добавлении изображений в формате BMP или TIFF, а для наиболее распространенных форматов, таких как JPEG и PNG, эта функция бесполезна.
- CompressFonts – функция позволяет указать, следует ли сжимать добавляемые в документ шрифты. Ее нужно вызывать до вызова функций добавления шрифтов. В результате моих экспериментов, эта функция единственная, которая давала заметное уменьшение размера файла.
У многих PDF-документов большую часть размера файла составляют изображения. А значит единственным способом уменьшить размер такого PDF-документа – это предварительно ухудшить до приемлемого состояния качество изображений. Например, изображения могут иметь большое разрешение, которое можно спокойно уменьшить во много раз и это не скажется на качестве PDF-документа. Можно через параметры программы предоставить пользователю самому определить нужный ему баланс между качеством изображений и размером результирующего файла.
Добавим в класс, который формирует PDF-документ, поля с параметрами:
type
TCreatePDF = class
private
FPDF: TDebenuPDFLibrary;
// изменять или нет изображения
FInJpegScale: Boolean;
// качество сжатия изображения
FInJpegQuality: Integer;
// максимальное разрешение изображений
FInJpegMaxWidth: Integer;
FInJpegMaxHeight: Integer;
public
property InJpegScale: Boolean read FInJpegScale
write FInJpegScale;
property InJpegQuality: Integer read FInJpegQuality
write FInJpegQuality;
property InJpegMaxWidth: Integer read FInJpegMaxWidth
write FInJpegMaxWidth;
property InJpegMaxHeight: Integer read FInJpegMaxHeight
write FInJpegMaxHeight;
и метод:function AddScaledImageFromFile(const FileName: String;
const Options: Integer): Integer;
Реализация методов класса:constructor TCreatePDF.Create;
begin
inherited;
FInJpegScale := False;
FInJpegQuality := 75;
FInJpegMaxWidth := 0;
FInJpegMaxHeight := 0;
...
end;
function TCreatePDF.AddScaledImageFromFile(const FileName: String;
const Options: Integer): Integer;
var
jpg: TJPEGImage;
ms : TStream;
iNewWidth, iNewHeight: Integer;
bNewJpegQuality: Boolean;
begin
if FInJpegScale and SameText(ExtractFileExt(FileName), '.jpg')
then try // jpeg, который надо обработать
jpg := TJPEGImage.Create;
try
jpg.Loadfromfile(FileName);
if (FInJpegQuality <> 0) and (jpg.CompressionQuality <> FInJpegQuality)
then begin
bNewJpegQuality := True;
jpg.CompressionQuality := FInJpegQuality;
end
else bNewJpegQuality := False;
if FInJpegMaxWidth > 0
then iNewWidth := FInJpegMaxWidth
else iNewWidth := jpg.Width;
if FInJpegMaxHeight > 0
then iNewHeight := FInJpegMaxHeight
else iNewHeight := jpg.Height;
if (jpg.Width > iNewWidth) or (jpg.Height > iNewHeight)
then ScaleJpeg(jpg, iNewWidth, iNewHeight, HALFTONE)
else if bNewJpegQuality then
jpg.Compress;
// добавляем jpeg в PDF через поток
ms := TMemoryStream.Create;
try
jpg.SaveToStream(ms);
Result := FPDF.AddImageFromStream(ms, Options);
finally
ms.Free;
end
finally
jpg.free;
end;
except
on E: Exception do
Result := 0;
end
else Result := FPDF.AddImageFromFile(FileName, Options);
end; Реализацию метода ScaleJpeg я подробно рассмотрел в статье "Изменение разрешения изображения". Так же можно воспользоваться class-helper'ом из продолжения этой статьи. То есть строку вызова функции изменения разрешения изображения "then ScaleJpeg(jpg, iNewWidth, iNewHeight, HALFTONE)" заменить на вызов метода "then jpg.Resize(iNewWidth, iNewHeight, HALFTONE)".Таким образом мы видим, что стандартные методы библиотеки Debenu Quick PDF Library почти не могут помочь в уменьшении размера создаваемого файла. Это, я думаю, касается и других подобных библиотек. Поэтому спасти программиста может только индивидуальный контроль различных элементов документа.
Комментариев нет:
Отправить комментарий