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
- DOM khoan dung chấp nhận các thẻ đóng bị bỏ qua phổ biến, giữ thứ tự văn bản, bỏ qua các vùng tài liệu không hoạt động, và thực thi
MaxDOMNodes - Cascade hỗ trợ selector type, class, ID, attribute đẳng thức, descendant, và direct-child, thứ tự nguồn, specificity, khai báo nội tuyến,
!important,@media print, và lề@page - Bố cục phân trang hỗ trợ luồng khối, tiêu đề, danh sách, đường viền, nền, khoảng cách hộp, ngắt trang tường minh, bảng, ảnh, và phân trang tràn tự động
- Ô nhập văn bản, nút, hộp kiểm, nút radio, vùng văn bản, và điều khiển select được dựng thành appearance tĩnh hoặc trường AcroForm gốc khi
CreateAcroFormsđược bật
Đ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