function RenderPageProgressive(
Bitmap : TBitmap;
Left, Top, Width, Height: Integer;
const AToken : IPdfCancellationToken;
Rotation : TRotation = ro0;
Options : TRenderOptions = [];
Color : TColor = clWhite): TPdfProgressiveStatus;
Color = clNone или Color = clDefault выбирает прозрачный фон и растровое изображение PDFium с поддержкой альфа-канала. Непокрытые пиксели сохраняют нулевую альфу независимо от нативного запроса фоновой прозрачности страницы, включая частично отрисованные результаты, возвращённые после отмены; clWhite остаётся стандартным непрозрачным фоном
RenderPageProgressive отрисовывает текущую страницу в предоставленный
Bitmap с использованием цикла PDFium
FPDF_RenderPageBitmap_Start +
FPDF_RenderPage_Continue. Между итерациями обратный вызов
IFSDK_PAUSE PDFium опрашивает AToken.IsCancelled —
когда приложение отменило операцию, цикл корректно завершается, и растровое
изображение содержит частично выполненную работу
Применяется тот же быстрый путь с нулевым копированием, появившийся в v1.21.0: PDFium отрисовывает напрямую в DIB-буфер целевого TBitmap вместо промежуточного использования внутреннего буфера. Существует унаследованный резервный режим построчной отрисовки для маловероятного случая, когда целевой DIB не может быть обёрнут
Возвращаемое значение определяет, чем завершилась отрисовка:
FPDF_RENDER_FAILED. Состояние растрового изображения не определеноПередайте AToken = nil, чтобы отрисовать до завершения
без пауз. В этом случае функция всё ещё вызывает
FPDF_RenderPage_Continue до DONE, но никогда не
возвращает prsCancelled. Это полезно, когда вызывающему
нужны промежуточные точки перерисовки прогрессивного цикла (пользовательский
OnPaint, отображающий растровое изображение в процессе), но отмена не требуется
PixelFormat = pf32bit для включения пути с нулевым копированием; другие форматы пикселей повышаются до pf32bit перед началом отрисовкиTPdf сериализует вызовы отрисовки для каждого экземпляра; вызывающим всё равно следует избегать изменения или выгрузки документа во время отрисовкиEPdfError, когда Bitmap равен nil — контракт требует растровое изображение, выделенное вызывающим, так как путь с нулевым копированием требует известной компоновки DIB
uses FPdfAsync;
var
Bitmap: TBitmap;
Status: TPdfProgressiveStatus;
begin
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf32bit;
Bitmap.SetSize(2480, 3508); // A4 @ 300 DPI
Status := Pdf1.RenderPageProgressive(Bitmap,
0, 0, Bitmap.Width, Bitmap.Height,
CancelToken, ro0, [reAnnotations]);
case Status of
prsDone: SaveBitmap(Bitmap);
prsCancelled: Log.Add('Cancelled mid-page');
prsFailed: Log.Add('PDFium FPDF_RENDER_FAILED');
end;
finally
Bitmap.Free;
end;
end;