HTML5 Paged-Media Import

THPDFHTMLImporter.RenderHTML5 chuyển markup HTML5 khoan dung và CSS in thành nội dung PDF phân trang trong khi vẫn giữ đường dẫn RenderHTML gọn nhẹ kế thừa

Độ dài CSS cùng Margin, BaseFontSize, ListIndent và BlockSpacing của importer tính theo point, nên cả hai renderer cho ra cùng một trang bất kể THotPDF.Resolution đặt là bao nhiêu; phần vẽ của bạn trước và sau khi import vẫn dùng 1/Resolution inch

Khai báo

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;

Profile contract

HTML5ProfileVersion trả về 1 và HTML5ProfileMilestones báo cáo parser và cascade, bố cục phân trang, bảng và form, và tài nguyên có giới hạn

Đo đoạn văn và hướng viết

Đoạn văn được ngắt dòng dựa trên advance đã đo của font hiện tại, bao gồm thay đổi font, run đậm và nghiêng, letter spacing, word spacing, ngắt dòng tường minh, và biên giới ký tự Đông Á; căn lề và trang trí áp dụng riêng cho từng dòng kết quả

direction: ltr, direction: rtl, và thuộc tính dir của HTML chọn hướng đoạn văn; dir="auto" dùng hướng Unicode của ký tự strong đầu tiên

Trên Windows, các run script hai chiều được giải bằng Uniscribe và sắp xếp lại xuyên qua các biên giới style, trong khi engine văn bản PDF hiện có lo glyph shaping bên trong từng run; hướng của tài liệu, viewer preferences, và trạng thái văn bản trang đã lưu được khôi phục sau dòng

Ghi đè hướng nội dòng, bdi, và bdo hiện vẫn dùng thứ tự đoạn văn và sinh diagnostic hdkLayoutFallback; unicode-bidi nằm ngoài profile này, còn script shaping vẫn theo cấu hình shaping của tài liệu

Phân mảnh đoạn văn

widows và orphans là các số nguyên dương kế thừa được, mặc định đều là 2; phân trang dùng line box đã đo thay vì số ký tự ước lượng

Importer dời một đoạn văn hoặc chỉnh lại chỗ cắt của nó để chừa lại số dòng tối thiểu được yêu cầu trước và sau ngắt trang; break-inside: avoid giữ nguyên một đoạn văn khi nó vừa đủ trên một trang mới

Khi một trang không thể chứa ràng buộc được yêu cầu, việc dựng vẫn tiến triển bằng cách nới lỏng ràng buộc và ghi nhận hdkPaginationConstraint; mỗi mảnh trang nhận nền và đường viền riêng của nó

Ngắt chữ tùy chọn

hyphens: none chặn các điểm ngắt tùy ý, còn mặc định hyphens: manual dùng U+00AD hoặc ­; dấu gạch nối hiện hình chỉ được phát ra khi điểm ngắt đã chọn được dùng

hyphens: auto còn gọi OnHyphenate với từ và giá trị lang HTML kế thừa; thiếu callback nó vẫn giữ các điểm ngắt thủ công và báo layout fallback, vì không có từ điển ngôn ngữ nào được đóng gói sẵn

Vị trí ngắt đếm code unit UTF-16 tính từ đầu từ; các vị trí không hợp lệ, ngoài dải, cắt giữa cặp surrogate, và cắt giữa dấu combining cơ bản bị bỏ qua

THPDFHTMLHyphenationEvent = procedure(
  Sender: TObject;
  const WordText, Language: WideString;
  var BreakPositions: TArray<Integer>
) of object;

Hộp flex và grid có giới hạn

display: flex hỗ trợ row, row-reverse, column, và column-reverse; con theo hàng dùng độ rộng tường minh hoặc chia sẻ phần width còn lại, và giá trị flex-grow dương phân bổ không gian thêm theo trọng số

Hàng hỗ trợ justify-content dạng start, end, center, space-between, space-around, và space-evenly, cùng căn chỉnh cross-axis start, end, center, và stretch; luồng cột hỗ trợ bố cục dọc tự nhiên và phát diagnostic cho phân bố chiều cao cố định hoặc căn chỉnh cross-axis không được hỗ trợ

display: grid hỗ trợ column track độ dài cố định dương và fr, bao gồm repeat(n, tracks) có giới hạn với tối đa 64 cột; ô được đặt theo thứ tự nguồn, lấp từng hàng một

grid-column: span N và grid-column-end: span N cho phép một phần tử con chiếm các track liền kề cùng gap ở giữa; mục không vừa hàng hiện tại chuyển sang hàng kế tiếp, và span lớn hơn số track sinh layout fallback

flex-wrap: wrap bắt đầu một dòng mới khi độ rộng tường minh và gap của mục kế tiếp không vừa; mỗi dòng áp dụng flex-grow và justify-content độc lập, còn row-reverse và RTL đảo vị trí bên trong từng dòng mà không chuyển mục giữa các dòng

gap nhận một hoặc hai độ dài, với ghi đè row-gap và column-gap độc lập; các hàng song song nằm cùng một trang và được kiểm tra trước khi vẽ

Phần tử con song song hỗ trợ khối văn bản có style nội dòng, container khối thường lồng nhau đệ quy với padding, đường viền và nền, container flex và grid lồng nhau, ảnh, và điều khiển form tĩnh hoặc gốc

Ảnh dùng byte do callback cung cấp hoặc data URI, giữ nguyên tỷ lệ khung hình gốc khi không chỉ định chiều cao, và được giải mã một lần cho mỗi node DOM; preflight và fallback tái sử dụng cùng một ảnh đã cache mà không tốn thêm yêu cầu tài nguyên

Tất cả hộp con được đo trước khi bất kỳ hàng song song nào được vẽ, nên nội dung không được hỗ trợ hoặc quá khổ rơi về luồng trang dọc mà không lặp lại các hàng đã vẽ trước đó; hoạch định lồng nhau giới hạn 64 mức và tiêu tốn ngân sách layout-operation hiện có

Phần tử con xuống dòng không có độ rộng tường minh chiếm trọn một dòng; bảng và danh sách bên trong phần tử con song song, flex basis và shrink, wrap-reverse, intrinsic track sizing, grid row track và row span, và đặt vị trí grid tường minh vẫn nằm ngoài profile này và sinh diagnostic quan sát được

Diagnostic CSS không được hỗ trợ

Diagnostics cung cấp các record chứa Kind, Subject, Value, và MessageText; OnDiagnostic nhận cùng thông tin đó trong lúc dựng

Thuộc tính lạ, giá trị không được hỗ trợ, selector không được hỗ trợ, và at-rule không được hỗ trợ bị bỏ qua kèm diagnostic, bao gồm cả khai báo trong các quy tắc stylesheet không được dùng đến; pseudo selector bị bỏ qua thay vì bị coi là selector type thường

StrictCSS, mặc định tắt, ném EHPDFHTMLUnsupportedCSS khi có diagnostic; nội dung trước đó có thể đã được phát ra, nên bên gọi cần import kiểu all-or-nothing nên dùng một tài liệu riêng

MaxDiagnostics mặc định 256 và giới hạn số record được giữ; DiagnosticCount và việc chuyển callback vẫn quan sát được sau khi chạm trần lưu trữ, còn giới hạn không dương sẽ tắt lưu record

Bounded resources

Stylesheet ngoài, ảnh, và font @font-face bị vô hiệu hóa trừ khi OnResource cung cấp byte của chúng, nên nhập HTML không bao giờ mở tệp hoặc kết nối mạng một cách ngầm định

@font-face hỗ trợ một nguồn url(...), tùy chọn format('truetype') hoặc format('opentype'), một bí danh họ font, style normal hoặc italic, và weight normal, bold, 400, hoặc 700; font-display chấp nhận các policy chuẩn vì import ngoại tuyến nạp tài nguyên đồng bộ

Font phải là tài nguyên TrueType hoặc OpenType sfnt nhúng được với tên họ Windows ASCII tối đa 31 ký tự; WOFF, bộ sưu tập font, local(...), variable descriptor, và danh sách nguồn sinh diagnostic

Font được chấp nhận được đăng ký riêng trong bộ nhớ tiến trình trên Windows và thuộc sở hữu của tài liệu cho tới khi tài liệu bị hủy, nên giải phóng importer trước EndDoc không làm hỏng việc nhúng font trì hoãn

Tài nguyên data: và kết quả callback dùng chung các giới hạn MaxResources, MaxResourceBytes, và MaxTotalResourceBytes

MaxDecodedImageBytes mặc định 128 MiB và tự giới hạn cache ảnh đã giải mã ở bốn byte trên mỗi pixel; kích thước BMP và PNG được kiểm tra trước khi giải mã, và mọi ảnh được chấp nhận đều được kiểm tra trước khi giữ lại

MaxDOMNodes, MaxCSSRules, và MaxLayoutOperations giới hạn độc lập việc phân tích, xây dựng cascade, và công việc bố cục

THPDFHTMLResourceEvent = procedure(
  Sender: TObject;
  const URI: WideString;
  ResourceKind: THPDFHTMLResourceKind;
  var Data: TBytes;
  var ContentType: string;
  var Handled: Boolean
) of object;

Thống kê

THPDFHTMLImportStatistics báo cáo phiên bản hồ sơ, nút đã phân tích, quy tắc CSS, thao tác bố cục, ngắt trang, bảng, điều khiển form, yêu cầu tài nguyên, lượt nạp được chấp nhận và bị từ chối, byte tài nguyên được chấp nhận, dòng văn bản đã đo, dòng đã ngắt chữ, diagnostic, container flex, và container grid

OnLineLayout nhận chỉ mục trang và chỉ mục dòng đoạn văn tính từ 0, gốc tọa độ, chiều rộng và chiều cao đã đo, văn bản logic, hướng viết, và cờ ngắt chữ của dòng sau khi văn bản PDF thực tế đã được phát ra

Mỗi lần gọi RenderHTML5 đặt lại record thống kê, và vi phạm ngân sách ném EHPDFHTMLImportBudget

Ví dụ

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;

See also: THPDFPage.TextOutHTML, Declarative Layout DOM, AcroForm Support