HTML5 페이지 미디어 가져오기
THPDFHTMLImporter.RenderHTML5는 관대한 HTML5 마크업과 인쇄 CSS를 페이지 있는 PDF 콘텐츠로 변환하면서, 간결한 레거시 RenderHTML 경로를 유지합니다
CSS 길이와 importer의 Margin, BaseFontSize, ListIndent, BlockSpacing은 포인트 단위입니다. 따라서 THotPDF.Resolution을 어떤 값으로 설정했든 두 렌더러가 같은 페이지를 만들며, 가져오기 전후에 직접 그리는 콘텐츠는 여전히 1/Resolution 인치를 사용합니다
선언
function RenderHTML5(
const HTML: WideString;
const AuthorStyleSheet: WideString = ''
): Boolean;
function HPDFRenderHTML5Document(
Doc: THotPDF;
const HTML: WideString;
const AuthorStyleSheet: WideString = '';
MarginPt: Single = 72;
const FontName: AnsiString = 'Arial';
FontSize: Single = 12
): Boolean;
프로필 계약
HTML5ProfileVersion은 1을 반환하고, HTML5ProfileMilestones은 파서와 캐스케이드, 페이지 레이아웃, 표와 양식, 그리고 바운딩된 리소스를 보고합니다
- 관대한 DOM은 일반적인 생략 닫기 태그를 수용하고, 텍스트 순서를 유지하며, 비활성 문서 영역을 건너뛰고,
MaxDOMNodes을 적용합니다 - 캐스케이드는 유형, 클래스, ID, 동등 비교 속성, 자손 및 직계 자식 선택자, 소스 순서, 특이성, 인라인 선언,
!important,@media print및@page여백을 지원합니다 - 페이지 레이아웃은 블록 흐름, 제목, 목록, 테두리, 배경, 상자 간격, 명시적 페이지 나누기, 표, 이미지 및 자동 넘침 페이지 매김을 지원합니다
- 텍스트 입력, 단추, 확인란, 라디오 단추, 텍스트 영역 및 선택 컨트롤은
CreateAcroForms이 활성화되면 정적 모양 또는 기본 AcroForm 필드로 렌더링됩니다
측정된 문단과 방향
문단은 현재 글꼴의 측정된 advance로 줄바꿈합니다. 글꼴 변경, bold·italic run, 자간, 단어 간격, 명시적 줄바꿈, 동아시아 문자 경계가 모두 반영되며, 정렬과 장식은 만들어진 각 줄에 따로 적용됩니다
direction: ltr, direction: rtl과 HTML dir 속성이 문단 방향을 고르고, dir="auto"는 첫 강세 문자의 Unicode 방향을 씁니다
Windows에서는 쌍방향 script run을 Uniscribe로 해석해 스타일 경계를 넘어 재배열하고, run 안의 glyph shaping은 기존 PDF 텍스트 엔진이 처리합니다. 문서 방향, viewer 기본 설정, 저장된 페이지 텍스트 상태는 줄 뒤에서 복원됩니다
인라인 방향 재정의, bdi, bdo는 현재 문단 순서를 쓰며 hdkLayoutFallback 진단을 냅니다. unicode-bidi는 이 프로필의 범위 밖이고, script shaping은 여전히 문서의 shaping 구성을 따릅니다
문단 분할
widows와 orphans는 상속되는 양의 정수이며 둘 다 기본값 2입니다. 페이지 매김은 추정 문자 수가 아니라 측정된 line box를 사용합니다
가져오기는 페이지 나누기 앞뒤로 요청된 최소 줄 수가 남도록 문단을 옮기거나 나누는 지점을 조정합니다. break-inside: avoid는 새 페이지에 들어갈 수 있을 때 문단을 한 덩어리로 유지합니다
한 페이지가 요청된 제약을 담지 못하면 렌더링은 제약을 완화하고 hdkPaginationConstraint를 기록하면서 진행을 이어갑니다. 각 페이지 조각은 자신만의 배경과 테두리를 받습니다
선택적 하이픈 넣기
hyphens: none은 임의 분점을 끄고, 기본값인 hyphens: manual은 U+00AD 또는 ­를 씁니다. 보이는 하이픈은 선택된 분점이 실제로 쓰일 때만 출력됩니다
hyphens: auto는 추가로 단어와 상속된 HTML lang 값을 OnHyphenate에 넘깁니다. 콜백이 없으면 수동 분점을 유지하고 레이아웃 폴백을 보고합니다. 언어 사전은 번들되지 않기 때문입니다
분점 위치는 단어 시작부터의 UTF-16 code unit 수로 셉니다. 잘못됐거나 범위를 벗어났거나 surrogate를 가르거나 기본 combining mark를 가르는 위치는 무시됩니다
THPDFHTMLHyphenationEvent = procedure(
Sender: TObject;
const WordText, Language: WideString;
var BreakPositions: TArray<Integer>
) of object;
한도가 있는 flex와 grid 박스
display: flex는 row, row-reverse, column, column-reverse를 지원합니다. 행 자식은 명시적 폭을 쓰거나 남은 폭을 나누고, 양수 flex-grow 값은 추가 공간을 가중 배분합니다
행은 justify-content의 start, end, center, space-between, space-around, space-evenly와 start, end, center, stretch 교차축 정렬을 지원합니다. column 흐름은 자연스러운 세로 배치를 지원하고, 지원되지 않는 고정 높이 분배나 교차축 정렬에는 진단을 냅니다
display: grid는 양수 고정 길이와 fr column 트랙을 지원하며, 최대 64열의 한도가 있는 repeat(n, tracks)도 포함합니다. cell은 소스 순서대로 한 행씩 채워 배치됩니다
grid-column: span N과 grid-column-end: span N은 자식이 연속 트랙과 사이 gap을 차지하게 합니다. 현재 행에 들어가지 않는 항목은 다음 행으로 넘어가고, 트랙 수보다 큰 span은 레이아웃 폴백을 냅니다
flex-wrap: wrap은 다음 항목의 명시적 폭과 gap이 들어가지 않으면 새 줄을 시작합니다. 각 줄은 독립적으로 flex-grow와 justify-content를 적용하고, row-reverse와 RTL은 항목을 줄 사이로 옮기지 않고 각 줄 안에서만 순서를 뒤집습니다
gap은 길이 하나 또는 둘을 받고, row-gap과 column-gap으로 따로 재정의할 수 있습니다. 나란한 행은 한 페이지에 머무르며 그리기 전에 검사됩니다
나란한 자식은 인라인 스타일이 있는 텍스트 블록, padding·테두리·배경이 있는 재귀 중첩 평범 블록 컨테이너, 중첩 flex·grid 컨테이너, 이미지, 정적 또는 네이티브 양식 컨트롤을 지원합니다
이미지는 콜백이 공급한 바이트나 data URI 바이트를 쓰고, 높이를 지정하지 않으면 고유 종횡비를 유지하며, DOM 노드마다 한 번 디코딩됩니다. preflight와 폴백은 같은 캐시된 이미지를 재사용하고 리소스 요청을 추가로 소비하지 않습니다
모든 자식 box는 나란한 행을 그리기 전에 측정되므로, 지원되지 않거나 과대한 콘텐츠는 이미 그린 행을 반복하지 않고 세로 페이지 흐름으로 폴백합니다. 중첩 계획은 64단계로 제한되며 기존 레이아웃 작업 예산을 소비합니다
명시적 폭이 없는 감싸는 자식은 완전한 줄 하나를 차지합니다. 나란한 자식 안의 표와 목록, flex basis와 shrink, wrap-reverse, 고유 트랙 크기 계산, grid row 트랙과 row span, 명시적 grid 배치는 이 프로필의 범위 밖이며 관측 가능한 진단을 냅니다
지원되지 않는 CSS 진단
Diagnostics는 Kind, Subject, Value, MessageText를 담은 레코드를 노출하고, OnDiagnostic은 렌더링 중 같은 정보를 받습니다
알 수 없는 속성, 지원되지 않는 값, 지원되지 않는 선택자, 지원되지 않는 at-rule은 진단과 함께 무시됩니다. 다른 데 쓰이지 않는 스타일시트 규칙의 선언도 포함되고, 유사 선택자는 평범한 유형 선택자로 다뤄지지 않고 건너뛰어집니다
기본값이 꺼져 있는 StrictCSS는 진단이 나오면 EHPDFHTMLUnsupportedCSS를 발생시킵니다. 이전 콘텐츠가 이미 출력됐을 수 있으므로 전부 아니면 전무 방식의 가져오기가 필요하면 별도 문서를 쓰세요
MaxDiagnostics는 기본값 256으로 유지되는 레코드를 제한합니다. 저장 한도에 도달한 뒤에도 DiagnosticCount와 콜백 전달은 계속 관측되며, 양수가 아닌 한도는 레코드 저장을 끕니다
바운딩된 리소스
외부 스타일시트, 이미지, @font-face 글꼴은 OnResource이 해당 바이트를 제공하지 않는 한 비활성화되므로, HTML 가져오기는 암묵적으로 파일이나 네트워크 연결을 열지 않습니다
@font-face는 url(...) 소스 하나, 선택적 format('truetype') 또는 format('opentype'), family 별칭, normal 또는 italic 스타일, normal, bold, 400, 700 weight를 지원합니다. 오프라인 가져오기는 리소스를 동기로 불러오므로 font-display는 표준 정책을 모두 받아들입니다
글꼴은 31자 이하의 ASCII Windows family 이름을 가진 내장 가능한 TrueType 또는 OpenType sfnt 리소스여야 합니다. WOFF, 폰트 컬렉션, local(...), variable 디스크립터, 소스 목록은 진단을 냅니다
받아들여진 글꼴은 Windows에서 프로세스 메모리에 private으로 등록되고 문서가 파괴될 때까지 문서가 소유하므로, EndDoc 전에 importer를 해제해도 늦은 폰트 내장은 무효화되지 않습니다
data: 리소스와 콜백 결과는 MaxResources, MaxResourceBytes 및 MaxTotalResourceBytes 제한을 공유합니다
MaxDecodedImageBytes는 기본값 128MiB로 픽셀당 4바이트 기준 디코딩된 이미지 캐시를 독립적으로 제한합니다. BMP과 PNG 차원은 디코딩 전에 검사하고, 받아들여진 그림은 유지되기 전에 매번 검사합니다
MaxDOMNodes, MaxCSSRules 및 MaxLayoutOperations은 파싱, 캐스케이드 구성 및 레이아웃 작업을 각각 독립적으로 바인딩합니다
THPDFHTMLResourceEvent = procedure(
Sender: TObject;
const URI: WideString;
ResourceKind: THPDFHTMLResourceKind;
var Data: TBytes;
var ContentType: string;
var Handled: Boolean
) of object;
통계
THPDFHTMLImportStatistics는 프로필 버전, 파싱된 노드, CSS 규칙, 레이아웃 작업, 페이지 나누기, 표, 양식 컨트롤, 리소스 요청, 수락 및 거부된 로드, 수락된 리소스 바이트, 측정된 텍스트 줄, 하이픈 넣은 줄, 진단, flex 컨테이너, grid 컨테이너를 보고합니다
OnLineLayout는 실제 PDF 텍스트가 출력된 뒤 줄의 0부터 시작하는 페이지·문단 줄 인덱스, 원점, 측정된 폭과 높이, 논리 텍스트, 방향, 하이픈 여부를 받습니다
모든 RenderHTML5 호출은 통계 레코드를 재설정하며, 예산 위반은 EHPDFHTMLImportBudget을 발생시킵니다
예제
Importer := THPDFHTMLImporter.Create(Doc);
try
Importer.CreateAcroForms := True;
Importer.MaxResources := 16;
Importer.RenderHTML5(
'<style>@page { margin: 36pt } ' +
'table { width: 100% }</style>' +
'<h1>Invoice</h1>' +
'<table><tr><td>Total</td><td>42</td></tr></table>' +
'<input name="approved" type="checkbox">'
);
finally
Importer.Free;
end;
추가 정보: THPDFPage.TextOutHTML, 선언적 레이아웃 DOM, AcroForm 지원