선언적 레이아웃 DOM
HPDFLayoutDOM은 THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, 소유 overflow 조각, ImmediateFlushLayout 위에 재사용 가능한 문서 컴포넌트를 구축합니다
문서 및 섹션 구성
Document := THPDFDOMDocument.Create;
Renderer := THPDFDOMRenderer.Create;
try
Section := Document.AddSection;
Section.PageWidth := 595.28;
Section.PageHeight := 841.89;
Section.Header := THPDFDOMText.Create('Quarterly report');
Section.Footer := THPDFDOMText.Create('Confidential');
Section.Body.Style.Padding := 12;
Section.Body.Style.Spacing := 8;
Section.Body.AddText(BodyText, 'Narrative');
PDF.OutputStream := Output;
PDF.ImmediateFlushLayout := True;
Statistics := Renderer.Render(Document, PDF);
finally
Renderer.Free;
Document.Free;
end;
THPDFDOMDocument은 자신의 섹션을 소유하고, 각 THPDFDOMSection은 자신의 본문, 머리글, 바닥글, 스타일을 소유하며, 각 스택 또는 컨테이너는 자신에게 붙은 컴포넌트를 소유합니다
THPDFDOMRenderer.Render은 대상 문서를 시작하고 끝내며, 각 새 섹션마다 새 페이지를 만들고, 연속 페이지에서 섹션 장식을 반복하며, 페이지, 배치, 분할, 장식, 구조, 마크 콘텐츠, 아티팩트, 최대 연속 통계를 반환합니다
Render을 호출하기 전에 모든 THotPDF 출력, 압축, 적합성, 레이어, 즉시 플러시 옵션을 설정하십시오
GenerateStructure는 기본적으로 True이므로 렌더러는 연속 안전 논리 구조 트리도 구축하고 대상에 언어가 없으면 THPDFDOMDocument.Language를 사용합니다
컴포넌트
THPDFDOMText는 Unicode 텍스트를 감싸고 너비와 상속된 텍스트 메트릭별로 줄 경계를 캐시하며 소스 텍스트를 복사하지 않고 소스 문자 범위를 통해 분할합니다THPDFDOMSpacer는 수직 공간을 예약하고 페이지를 넘어 분할할 수 있습니다THPDFDOMStack은 소유 하위 요소를 상속된 padding 및 spacing으로 수직 배치합니다THPDFDOMContainer는 하나의 소유 하위 요소 주위에 스타일 박스를 추가하고 분할 연속을 전달합니다THPDFDOMTable은 가중 열을 해결하고 스타일 행과 셀을 그리며 연속 페이지에서 선행 헤더 행을 반복합니다THPDFDOMList은 레이블 및 본문 컴포넌트가 있는 번호 또는 비번호 목록 항목을 만듭니다THPDFDOMImage는 복제된 그래픽을 소유하고 명시적 치수를 해결하며 그림 의미 및 압축 제어를 제공합니다
모든 컴포넌트는 안정적인 Name, Path, Style, Clone, Measure, Draw, Split 계약과 의미 역할, 언어, 대체 텍스트, 대체 텍스트, 확장 텍스트, 아티팩트 재정의를 노출합니다
최상위 본문 순회는 선형이며 컴포넌트를 복제하지 않습니다. 텍스트 및 표 연속은 완전한 콘텐츠 트리를 복사하는 대신 범위 또는 행 슬라이스 메타데이터를 유지합니다
스타일 상속
THPDFDOMStyle은 글꼴 이름, 크기, 스타일, 텍스트 색상, 배경, 테두리, padding, spacing, 줄 높이를 부모 체인을 통해 해결합니다
섹션 스타일은 본문과 장식의 부모이고, 스택 또는 컨테이너 스타일은 하위 요소의 부모이며, 표 스타일은 행을 통해 셀로 흐릅니다
명시적으로 할당된 값만 부모를 재정의합니다. Clear는 로컬 할당과 부모 링크를 제거하고, Assign은 소유권이나 조상 없이 로컬 할당을 복사합니다
64단계보다 깊은 부모 체인은 순환 또는 무한대로 거부됩니다
재사용 가능한 컴포넌트 팩토리
THPDFDOMComponentFactory는 호출마다 호출자 소유 THPDFDOMComponent 인스턴스 하나를 만드는 익명 함수입니다
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
팩토리 이름은 대소문자 무시이며 고유하고, 각 호출은 새 컴포넌트 인스턴스를 반환해야 하며, 받는 컨테이너는 Add 이후 소유권을 취합니다
선언된 컴포넌트 하나를 여러 소유 지점에서 재사용해야 하면 SetHeaderClone, SetFooterClone 또는 Clone을 사용하십시오
반복 헤더 표
Table := THPDFDOMTable.Create('Orders');
Table.AddColumn(1);
Table.AddColumn(3);
Header := Table.AddRow(18, True);
Header[0].Text := 'ID';
Header[1].Text := 'Description';
Row := Table.AddRow(22);
Row[0].Text := '1001';
Row[1].Text := 'Bounded streaming layout';
Section.Body.Add(Table);
헤더 행은 연속적이고 본문 행 앞에 와야 하며, 양의 열 가중치는 사용 가능한 너비를 나누고, 행 높이는 명시적 양수 값입니다
RepeatHeaders가 true이면 분할에는 모든 선행 헤더 행과 최소한 하나의 본문 행에 대한 공간이 필요하여 헤더 전용 연속 페이지를 방지합니다
페이지 매김 및 실패 경계
렌더러는 먼저 각 컴포넌트를 남은 본문 사각형에 대해 다시 측정하고, 가능하면 분할 불가 최소 조각을 새 페이지로 옮기며, 유효한 모든 분할을 PlaceLayoutElement에 위임합니다
빈 본문 페이지에 맞출 수 없는 요소는 콘텐츠를 조용히 버리는 대신 안정적인 요소 경로로 예외를 발생시킵니다
MaximumContinuationDepth는 기본값 100,000이며 진행되지 않는 연속을 반복해서 반환하는 잘못된 컴포넌트를 제한합니다
섹션 페이지 치수는 양수여야 하고, 여백 및 장식 간격은 음수일 수 없으며, 머리글과 바닥글 지오메트리는 양의 본문 사각형을 남겨야 합니다
C++Builder
std::unique_ptr<THPDFDOMDocument> document(new THPDFDOMDocument());
THPDFDOMSection* section = document->AddSection();
section->Header = new THPDFDOMText(L"Report", "Header");
section->Body->AddText(L"Declarative content", "BodyText");
std::unique_ptr<THPDFDOMRenderer> renderer(new THPDFDOMRenderer());
THPDFDOMRenderStatistics statistics =
renderer->Render(document.get(), pdf.get());
생성된 HPDFLayoutDOM.hpp은 동일한 문서, 스타일, 컴포넌트, 표, 섹션, 렌더러, 통계 표면을 내보냅니다