PDFium Delphi Component Docs

เมธอด RenderPagesParallel

Component: TPdf  ·  Unit: PDFium
เรนเดอร์คำขอหลายหน้าพร้อมกัน โดย worker ทุกตัวเป็นเจ้าของเอกสาร PDFium และแฮนเดิลหน้าที่แยกอิสระจากกัน

Syntax

function RenderPagesParallel(
  const PageNumbers : array of Integer;
  const Options : TPdfParallelRenderOptions;
  const CancellationToken: IPdfCancellationToken = nil): TPdfParallelRenderReport;

Description

RenderPagesParallel จับภาพเอกสารปัจจุบันลง TPdfRandomAccessStore เพียงครั้งเดียว ถอดการเข้ารหัสของสแนปชอต และคงแหล่งข้อมูลให้เปลี่ยนแปลงไม่ได้จนกว่าเอกสารของ worker ทุกตัวจะปิด

การจับภาพในหน่วยความจำถูกใช้ร่วมกันโดยตรงโดยไม่คัดลอกอาร์เรย์ไบต์ซ้ำ การจับภาพที่ spill ลงดิสก์ถูกเปิดเผยผ่าน file mapping แบบอ่านอย่างเดียวหนึ่งตัว และถ้า mapping ล้มเหลวจะ fallback ไปอ่านเป็นบล็อกผ่าน FPDF_LoadCustomDocument จาก store เดิมที่ thread-safe

worker ทุกตัวโหลดสำเนาชั่วคราวส่วนตัวของไบนารี PDFium เป็นโมดูลอิสระ ตั้งค่าโมดูลนั้นบนเธรดของตัวเอง และใช้ FPDF_DOCUMENT ของตัวเองซ้ำขณะโหลดและปิดหน้าที่ได้รับมอบหมาย

สถานะของโมดูล เอกสาร หน้า การเรนเดอร์แบบ progressive และบิตแมป ไม่ข้ามขอบเขต worker เลย จึงไม่เกิดการเรียกพร้อมกันที่ไม่ปลอดภัยเข้าโมดูล PDFium ตัวเดียว

PageNumbers ใช้ธรรมเนียมเลขหน้าแบบ 1-based ตามส่วนสาธารณะ และอาร์เรย์ Results ที่คืนกลับมาจะเรียงตรงกับลำดับคำขอเสมอ แม้ worker จะเสร็จผิดลำดับหรือหน้าใดหน้าหนึ่งล้มเหลว

ผลลัพธ์ที่สำเร็จแต่ละชุดเป็นเจ้าของ buffer พิกเซล 32 บิตแบบ top-down ที่ Stride = Width * 4 เรียงไบต์แบบ BGRA เว้นแต่ reReverseByteOrder จะร้องขอ RGBA

Options

FieldDefaultMeaning
Dpi96ความละเอียดเป้าหมาย ตั้งแต่มากกว่า 0 ถึง 2400 DPI
MaxWorkers00 เลือก worker ได้ถึงสี่ตัว มิฉะนั้นรับค่า 1 ถึง 64 โดยผูกด้วยจำนวนคำขอ
MaxPixelsPerPage64 MiPixelsปฏิเสธหน้าก่อนจอง buffer ผลลัพธ์ที่ใหญ่เกิน
MaxTotalOutputBytes512 MiBจำกัดผลรวมของ buffer พิกเซลที่สำเร็จซึ่งเก็บไว้
Rotationro0ใช้การหมุนเดียวกับทุกคำขอและสลับขนาดเอาต์พุตเมื่อ 90 หรือ 270 องศา
RenderOptions[]แฟล็กการเรนเดอร์ native ของ PDFium รวม annotations, grayscale, printing, smoothing และ reverse byte order
BackgroundColorclWhiteสีพื้นหลังพิกเซลเริ่มต้นก่อน PDFium วาดเนื้อหาหน้า

Results

Remarks

Example

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;

See Also

RenderPage, RenderPageProgressive, RenderTile