function RenderPagesParallel(
const PageNumbers : array of Integer;
const Options : TPdfParallelRenderOptions;
const CancellationToken: IPdfCancellationToken = nil): TPdfParallelRenderReport;
RenderPagesParallel은 현재 문서를 TPdfRandomAccessStore로 한 번 캡처하고 스냅샷 암호화를 제거한 뒤 모든 워커 문서가 닫힐 때까지 소스를 불변으로 유지합니다
메모리 내 캡처는 두 번째 바이트 배열 복사 없이 직접 공유되고, 디스크로 넘어간 캡처는 읽기 전용 파일 매핑 하나로 노출되며, 매핑에 실패하면 같은 스레드 안전 저장소에서 FPDF_LoadCustomDocument 블록 읽기로 폴백합니다
모든 워커는 활성 PDFium 바이너리의 사본을 독립 모듈로 로드하고 그 모듈을 자기 워커 스레드에서 초기화하며, 할당된 페이지를 로드하고 닫는 동안 자신의 FPDF_DOCUMENT를 재사용합니다
모듈, 문서, 페이지, 점진적 렌더, 비트맵 상태는 워커 경계를 절대 넘지 않으므로 하나의 PDFium 모듈로의 안전하지 않은 동시 호출을 피합니다
PageNumbers는 공개 1 기반 페이지 규약을 따르고 반환되는 Results 배열은 워커가 순서와 무관하게 끝나거나 개별 페이지가 실패해도 항상 요청 순서와 일치합니다
성공한 결과는 Stride = Width * 4인 위에서 아래로 향하는 32비트 픽셀 버퍼를 소유하며 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는 크기, 스트라이드, 픽셀 형식, 픽셀, 경과 시간을 반환합니다pprsCancelled는 점진적 렌더 루프 전이나 도중에 취소가 관찰되면 픽셀 없이 반환합니다pprsFailed는 잘못된 페이지, 네이티브 로드나 렌더 실패, 리소스 예산 거부를 ErrorMessage로 분리해 보고합니다TotalOutputBytes의 보관된 출력 바이트, 엔드투엔드 경과 시간을 집계합니다SourceSize, SourcePeakMemoryBytes, SourceStorageBackend는 한도가 적용된 캡처 비용을 노출합니다SourceBackingKind는 소스 캡처 뒤 ppsbSharedMemory, ppsbMemoryMappedFile, ppsbRandomAccessStore 중 하나입니다reInvert와 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;