PDFium Delphi Component Docs

RenderPageBandedToEncoder Метод

Компонент: TPdf  ·  Модуль: PDFium
Рендерит текущую страницу обрезаемыми горизонтальными полосами и передаёт каждый битмап полосы предоставленному вызывающим кодом кодировщику полосных изображений

Syntax

function RenderPageBandedToEncoder(Width, Height, BandHeight: Integer;
  Encoder: TPdfBandedImageEncoder; Rotation: TRotation = ro0;
  Options: TRenderOptions = []; Color: TColor = clWhite): TPdfBandedImageReport;

Width, HeightInteger. Размер изображения полной страницы в пикселях, как если бы оно рендерилось целиком
BandHeightInteger. Высота каждой полосы в пикселях. Последняя полоса короче, когда Height не кратно ей
EncoderTPdfBandedImageEncoder. Экземпляр кодировщика во владении вызывающего кода, принимающий поток полос
RotationTRotation. Поворот отображения, применяемый к странице: ro0, ro90, ro180 или ro270
OptionsTRenderOptions. Флаги рендеринга
ColorTColor. Фоновая заливка, применяемая к каждой полосе перед рендерингом
ResultTPdfBandedImageReport. Количества полос, закодированные строки, пиковые байты полосы, байты вывода и флаг завершения

Description

Метод управляет тем же полосным циклом, что и 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

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

Remarks

Передача nil-кодировщика, неположительных размеров или неположительной высоты полосы вызывает EPdfError

Произведение Width и Min(BandHeight, Height) должно оставаться в пределах четверти адресуемого диапазона Integer, иначе EPdfError сообщает, что буфер полосы превышает адресуемый размер

Переопределите GetBytesWritten в наследнике кодировщика, чтобы сообщать специфичную для кодировщика телеметрию вывода в OutputBytes; базовая реализация возвращает 0

Example

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;

See Also

RenderPageBanded, RenderPageBandedToStream, RenderPage, RenderTile