function RenderPagesParallel(
const PageNumbers : array of Integer;
const Options : TPdfParallelRenderOptions;
const CancellationToken: IPdfCancellationToken = nil): TPdfParallelRenderReport;
RenderPagesParallel 會將目前文件一次性擷取到 TPdfRandomAccessStore,移除快照加密,並在每個工作者文件關閉之前保持來源不可變
記憶體內擷取會直接共用,不需要第二次位元組陣列複製;溢流到磁碟的擷取會透過單一唯讀檔案對應公開;對應失敗時,則回退到 FPDF_LoadCustomDocument,從同一個執行緒安全存放區進行區塊讀取
每個工作者都會以獨立模組的方式載入作用中 PDFium 二進位檔的私人臨時複本,在其工作者執行緒上初始化該模組,並在載入與關閉指派頁面時重用自己的 FPDF_DOCUMENT
模組、文件、頁面、漸進式算繪與點陣圖狀態絕不跨越工作者邊界,避免對單一 PDFium 模組進行不安全的並行呼叫
PageNumbers 使用公開的以一為基底頁面慣例,傳回的 Results 陣列永遠符合要求順序,即使工作者未按順序完成或個別頁面失敗也一樣
每個成功的結果都擁有由上而下的 32 位元像素緩衝區,Stride = Width * 4,除非 reReverseByteOrder 要求 RGBA,否則使用 BGRA 位元組順序
| Field | Default | Meaning |
|---|---|---|
Dpi | 96 | 目標解析度,範圍從大於 0 到 2400 DPI |
MaxWorkers | 0 | 0 表示最多選用四個工作者,否則為 1 到 64,並受要求數量限制 |
MaxPixelsPerPage | 64 MiPixels | 在配置過大的結果緩衝區之前即拒絕該頁 |
MaxTotalOutputBytes | 512 MiB | 限制保留的成功像素緩衝區總量 |
Rotation | ro0 | 對每個要求套用相同旋轉,並在 90 或 270 度時交換輸出尺寸 |
RenderOptions | [] | 原生 PDFium 算繪旗標,包括註解、灰階、列印、平滑與反轉位元組順序 |
BackgroundColor | clWhite | 在 PDFium 繪製頁面內容之前的初始像素背景 |
pprsSucceeded 傳回尺寸、stride、像素格式、像素與耗用時間pprsCancelled 在漸進式算繪迴圈之前或期間觀察到取消時,不傳回任何像素pprsFailed 會在 ErrorMessage 中區分無效頁面、原生載入或算繪失敗,或資源額度拒絕TotalOutputBytes 中保留的輸出位元組數,以及端對端耗用時間SourceSize、SourcePeakMemoryBytes 與 SourceStorageBackend 公開有界擷取的成本SourceBackingKind 為 ppsbSharedMemory、ppsbMemoryMappedFile 或 ppsbRandomAccessStorereInvert 與 reNightDuotone 是算繪後的點陣圖轉換,此原始緩衝區 API 會拒絕它們SaveMemoryLimit 與 SaveTemporaryDirectory 管轄擷取的來源,而輸出額度涵蓋保留的結果緩衝區,而非 PDFium 內部配置TPdf 執行個體Pixels 陣列以釋放輸出記憶體
uses FPdfAsync;
var
Options: TPdfParallelRenderOptions;
Report: TPdfParallelRenderReport;
I: Integer;
begin
Options := TPdfParallelRenderOptions.Default;
Options.Dpi := 150;
Options.MaxWorkers := 4;
Options.RenderOptions := [reAnnotations];
Report := Pdf1.RenderPagesParallel([1, 3, 5, 7], Options, CancelToken);
for I := 0 to High(Report.Results) do
if Report.Results[I].Status = pprsSucceeded then
ConsumeTopDownPixels(Report.Results[I]);
end;