function RenderPagesParallel(
const PageNumbers : array of Integer;
const Options : TPdfParallelRenderOptions;
const CancellationToken: IPdfCancellationToken = nil): TPdfParallelRenderReport;
RenderPagesParallel jednorazowo przechwytuje bieżący dokument do TPdfRandomAccessStore, usuwa szyfrowanie snapshotu i utrzymuje źródło niemutowalnym, dopóki wszystkie dokumenty workerów się nie zamkną
Przechwycenie w pamięci jest współdzielone bezpośrednio, bez drugiej kopii tablicy bajtów, przechwycenie przelane jest eksponowane przez pojedyncze mapowanie pliku tylko do odczytu, a niepowodzenie mapowania wraca do odczytów blokowych FPDF_LoadCustomDocument z tego samego bezpiecznego dla wątków magazynu
Każdy worker wczytuje prywatną tymczasową kopię aktywnej biblioteki PDFium jako niezależny moduł, inicjalizuje ten moduł na swoim wątku roboczym i ponownie używa własnego FPDF_DOCUMENT przy wczytywaniu i zamykaniu przydzielonych stron
Stan modułu, dokumentu, strony, renderowania progresywnego i bitmapy nigdy nie przekracza granic workerów, co eliminuje niebezpieczne współbieżne wywołania do jednego modułu PDFium
PageNumbers używa publicznej konwencji stron indeksowanych od jedynki, a zwracana tablica Results zawsze odpowiada kolejności żądania, nawet gdy workery kończą poza kolejnością albo pojedyncza strona zawodzi
Każdy udany wynik posiada bufor pikseli 32-bitowy od góry do dołu z Stride = Width * 4, w kolejności bajtów BGRA, chyba że reReverseByteOrder zażąda RGBA
| Field | Default | Meaning |
|---|---|---|
Dpi | 96 | Docelowa rozdzielczość od powyżej 0 do 2400 DPI |
MaxWorkers | 0 | 0 wybiera do czterech workerów, w przeciwnym razie 1 do 64, ograniczone liczbą żądań |
MaxPixelsPerPage | 64 MiPixels | Odrzuca stronę przed alokacją przesadnie dużego bufora wyniku |
MaxTotalOutputBytes | 512 MiB | Ogranicza sumę zatrzymanych udanych buforów pikseli |
Rotation | ro0 | Stosuje tę samą rotację do każdego żądania i zamienia wymiary wyjściowe dla 90 lub 270 stopni |
RenderOptions | [] | Natywne flagi renderowania PDFium, w tym adnotacje, skala szarości, drukowanie, wygładzanie i odwrócona kolejność bajtów |
BackgroundColor | clWhite | Początkowe tło pikseli, zanim PDFium namaluje zawartość strony |
pprsSucceeded zwraca wymiary, stride, format pikseli, piksele i czas trwaniapprsCancelled nie zwraca pikseli, gdy anulowanie zostanie zaobserwowane przed pętlą renderowania progresywnego albo w jej trakciepprsFailed izoluje w ErrorMessage nieprawidłową stronę, natywne niepowodzenie wczytania lub renderowania albo odrzucenie z powodu budżetu zasobówTotalOutputBytes oraz całkowity czas od początku do końcaSourceSize, SourcePeakMemoryBytes i SourceStorageBackend ujawniają koszt ograniczonego przechwyceniaSourceBackingKind przyjmuje ppsbSharedMemory, ppsbMemoryMappedFile albo ppsbRandomAccessStorereInvert i reNightDuotone to transformacje bitmapy po renderowaniu i są odrzucane przez to surowe API buforówSaveMemoryLimit i SaveTemporaryDirectory rządzą przechwyconym źródłem, natomiast budżet wyjścia obejmuje zatrzymane bufory wyników, a nie wewnętrzne alokacje PDFiumTPdf współbieżnie, dopóki trwa przechwytywanie początkowego snapshotuPixels po ich zużyciu
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;