function RenderPageBandedToEncoder(Width, Height, BandHeight: Integer;
Encoder: TPdfBandedImageEncoder; Rotation: TRotation = ro0;
Options: TRenderOptions = []; Color: TColor = clWhite): TPdfBandedImageReport;
| Width, Height | Integer. Размер изображения полной страницы в пикселях, как если бы оно рендерилось целиком |
| BandHeight | Integer. Высота каждой полосы в пикселях. Последняя полоса короче, когда Height не кратно ей |
| Encoder | TPdfBandedImageEncoder. Экземпляр кодировщика во владении вызывающего кода, принимающий поток полос |
| Rotation | TRotation. Поворот отображения, применяемый к странице: ro0, ro90, ro180 или ro270 |
| Options | TRenderOptions. Флаги рендеринга |
| Color | TColor. Фоновая заливка, применяемая к каждой полосе перед рендерингом |
| Result | TPdfBandedImageReport. Количества полос, закодированные строки, пиковые байты полосы, байты вывода и флаг завершения |
Метод управляет тем же полосным циклом, что и RenderPageBanded, но вместо обратного вызова приложения передаёт каждый свежеотрисованный битмап Width x высоты полосы через внутренний мост в три виртуальных метода предоставленного кодировщика: сначала выполняется BeginImage(Width, Height), WriteBand(BandIndex, BandTopY, Bitmap) получает по одному вызову на полосу сверху вниз, а EndImage(Completed) закрывает изображение
BandIndex отсчитывается от нуля, а BandTopY — это смещение по y верха полосы в пикселях полной страницы, что и нужно пишущему полосы коду, чтобы разместить строки в выходном файле. Битмап принадлежит циклу рендеринга и освобождается сразу после возврата WriteBand, поэтому кодировщику, которому нужно сохранить пиксели, придётся их скопировать
WriteBand возвращает True для продолжения или False для аккуратной отмены оставшихся полос. EndImage(True) вызывается только когда каждая запрошенная строка была закодирована; отменённый или неудачный прогон получает EndImage(False), причём исключения на этом пути сбоя подавляются
Возвращаемый отчёт содержит Format = pbifCustom, количество отрисованных и принятых полос в BandsRendered и BandsEncoded, принятые строки в RowsEncoded, наибольший битмап полосы как Width x высоту полосы x 4 байта в PeakBandBytes, значение Encoder.GetBytesWritten в OutputBytes и Completed = True ровно тогда, когда RowsEncoded = Height
Пиковое хранилище пикселей страницы остаётся на уровне одного битмапа полосы, поэтому плакаты и чертежи можно экспортировать в печатном разрешении, ни разу не выделив полное целевое изображение
Передача nil-кодировщика, неположительных размеров или неположительной высоты полосы вызывает EPdfError
Произведение Width и Min(BandHeight, Height) должно оставаться в пределах четверти адресуемого диапазона Integer, иначе EPdfError сообщает, что буфер полосы превышает адресуемый размер
Переопределите GetBytesWritten в наследнике кодировщика, чтобы сообщать специфичную для кодировщика телеметрию вывода в OutputBytes; базовая реализация возвращает 0
type
TRawStripEncoder = class(TPdfBandedImageEncoder)
public
procedure BeginImage(Width, Height: Integer); override;
function WriteBand(BandIndex, BandTopY: Integer;
Bitmap: TBitmap): Boolean; override;
procedure EndImage(Completed: Boolean); override;
end;
Encoder := TRawStripEncoder.Create;
try
Report := Pdf.RenderPageBandedToEncoder(4960, 7016, 512, Encoder);
LogBandedExport(Report.BandsEncoded, Report.PeakBandBytes);
finally
Encoder.Free;
end;