HTML5 Paged-Media İçe Aktarma

THPDFHTMLImporter.RenderHTML5, tolere edici HTML5 markup'ını ve print CSS'i sayfalandırılmış PDF içeriğine dönüştürür; kompakt eski RenderHTML yolu yerinde kalır

CSS uzunlukları ile importer'ın Margin, BaseFontSize, ListIndent ve BlockSpacing değerleri punto cinsindendir; böylece her iki renderer da THotPDF.Resolution neye ayarlanmışsa olsun aynı sayfayı üretir. Import öncesi ve sonrası kendi çizimleriniz 1/Resolution inç birimini kullanmaya devam eder

Bildirim

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 sözleşmesi

HTML5ProfileVersion 1 döndürür; HTML5ProfileMilestones ise parser ve cascade, paged layout, tablolar ve formlar ile sınırlı kaynaklar aşamalarını bildirir

Ölçülen paragraflar ve yön

Paragraflar, font değişimlerini, kalın ve italik dizileri, harf aralığını, kelime aralığını, açık satır sonlarını ve Doğu Asya karakter sınırlarını kapsayacak şekilde geçerli fontun ölçülen ilerlemeleriyle sarılır; hizalama ve süsleme, oluşan her satıra ayrı ayrı uygulanır

direction: ltr, direction: rtl ve HTML dir attribute'ü paragraf yönünü seçer; dir="auto" ilk güçlü karakterin Unicode yönünü kullanır

Windows'ta çift yönlü betik dizileri Uniscribe ile çözümlenir ve stil sınırları boyunca yeniden sıralanır; her dizi içindeki glyph shaping mevcut PDF metin motoru tarafından halledilir. Belgenin yönü, viewer preferences ve kaydedilen sayfa metin durumu satırdan sonra geri yüklenir

Inline yön override'ları, bdi ve bdo şu anda paragraf sıralamasını kullanır ve bir hdkLayoutFallback teşhisi üretir; unicode-bidi bu profilin dışındadır, betik shaping yine belgenin shaping yapılandırmasını izler

Paragraf parçalanması

widows ve orphans miras alınan pozitif tamsayılardır ve ikisi de varsayılan olarak 2'dir; pagination, tahmini bir karakter sayısı yerine ölçülen satır kutularını kullanır

Importer, page break öncesi ve sonrasında istenen minimum satır sayısını bırakmak için bir paragrafı taşır veya bölünmesini ayarlar; break-inside: avoid, paragraf temiz bir sayfaya sığdığında onu bir arada tutar

Bir sayfa istenen kısıtı barındıramadığında render, kısıtı gevşeterek ve hdkPaginationConstraint kaydederek ilerler; her sayfa parçası kendi arka planını ve border'ını alır

İsteğe bağlı heceleme

hyphens: none isteğe bağlı satır sonlarını bastırır; varsayılan hyphens: manual U+00AD veya ­ kullanır. Görünür bir tire yalnızca seçilen kırılma kullanıldığında yazılır

hyphens: auto ayrıca OnHyphenate'i kelime ve miras alınan HTML lang değeriyle çağırır; callback olmadan manuel kırılmaları korur ve bir layout fallback bildirir, çünkü hiçbir dil sözlüğü paketle gelmez

Kırılma konumları kelimenin başından itibaren UTF-16 kod birimlerini sayar; geçersiz, aralık dışı, vekil ayıran ve temel combining-mark ayıran konumlar yok sayılır

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

Sınırlı flex ve grid kutuları

display: flex, row, row-reverse, column ve column-reverse destekler; satır çocukları açık genişlikler kullanır veya kalan genişliği paylaşır, pozitif flex-grow değerleri ek alanı tartar

Satırlar justify-content start, end, center, space-between, space-around ve space-evenly değerlerini, ayrıca start, end, center ve stretch çapraz eksen hizalamasını destekler; column akışı doğal dikey yerleşimi destekler ve desteklenmeyen sabit yükseklikli dağıtım veya çapraz eksen hizalaması için teşhis üretir

display: grid, 64 sütuna kadar sınırlı repeat(n, tracks) dahil pozitif sabit uzunluklu ve fr sütun track'lerini destekler; hücreler kaynak sırasına göre yerleştirilir ve tek seferde bir satır doldurur

grid-column: span N ve grid-column-end: span N, bir çocuğun ardışık track'leri ve aralarındaki boşlukları kaplamasına izin verir; mevcut satıra sığmayan öğe sonraki satıra geçer, track sayısından büyük span'lar layout fallback üretir

flex-wrap: wrap, sonraki öğenin açık genişliği ve boşluğu sığmadığında yeni bir satır başlatır; her satır flex-grow ve justify-content değerlerini bağımsız uygular, row-reverse ve RTL ise öğeleri satırlar arasında taşımadan her satır içindeki konumları tersine çevirir

gap bir veya iki uzunluk kabul eder; bağımsız row-gap ve column-gap override'ları vardır. Paralel satırlar tek sayfada kalır ve boyamadan önce denetlenir

Paralel çocuklar; inline stilli metin bloklarını, padding, border ve arka planlı özyinelemeli iç içe normal block container'ları, iç içe flex ve grid container'ları, image'leri ve statik ya da native form kontrollerini destekler

Image'ler callback ile sağlanan veya data URI baytlarını kullanır, yükseklik belirtilmediğinde kendi en-boy oranını korur ve DOM node başına bir kez çözülür; preflight ve fallback başka kaynak isteği harcamadan aynı önbellekteki image'i yeniden kullanır

Tüm çocuk kutular herhangi bir paralel satır boyanmadan önce ölçülür; böylece desteklenmeyen veya aşırı büyük içerik, önceden boyanmış satırları tekrarlamadan dikey sayfa akışına döner. İç içe planlama 64 düzeyle sınırlıdır ve mevcut layout-operation bütçesini harcar

Açık genişliği olmayan sarmalanan çocuklar tam bir satır kaplar; paralel çocuklar içindeki tablolar ve listeler, flex basis ve shrink, wrap-reverse, içsel track boyutlandırma, grid satır track'leri ve satır span'ları ile açık grid yerleşimi bu profilin dışında kalır ve gözlemlenebilir teşhisler üretir

Desteklenmeyen CSS teşhisleri

Diagnostics; Kind, Subject, Value ve MessageText içeren kayıtları açığa çıkarır; OnDiagnostic aynı bilgileri render sırasında alır

Bilinmeyen property'ler, desteklenmeyen değerler, selector'lar ve at-rule'lar bir teşhisle yok sayılır; kullanılmayan stylesheet rule'ları içindeki declaration'lar da buna dahildir. Pseudo selector'lar sıradan type selector'ı gibi işlenmek yerine atlanır

Varsayılan olarak kapalı olan StrictCSS, bir teşhistte EHPDFHTMLUnsupportedCSS fırlatır; daha önceki içerik çoktan yazılmış olabilir, bu yüzden all-or-nothing import isteyen çağıranlar ayrı bir belge kullanmalı

MaxDiagnostics varsayılan olarak 256'dır ve tutulan kayıtları sınırlar; depolama sınırına ulaşıldıktan sonra DiagnosticCount ve callback teslimi gözlemlenebilir kalır, pozitif olmayan bir sınır kayıt depolamayı devre dışı bırakır

Sınırlı kaynaklar

Harici stylesheet, image ve @font-face fontları, OnResource baytlarını sağlamadıkça devre dışıdır; böylece HTML import hiçbir zaman örtük olarak dosya ya da network bağlantısı açmaz

@font-face; tek bir url(...) kaynağını, isteğe bağlı format('truetype') veya format('opentype') değerini, bir aile takma adını, normal veya italic stili ve normal, bold, 400 ya da 700 ağırlığını destekler. Offline import kaynakları senkron yüklediği için font-display standart politikaları kabul eder

Fontlar, en fazla 31 karakterlik ASCII Windows aile adına sahip gömülebilir TrueType veya OpenType sfnt kaynakları olmalıdır; WOFF, font koleksiyonları, local(...), variable descriptor'lar ve kaynak listeleri teşhis üretir

Kabul edilen fontlar Windows'ta işlem belleğinde özel olarak kaydedilir ve belge yok edilene dek onun mülkiyetinde kalır; böylece EndDoc'ten önce importer'ı serbest bırakmak ertelenmiş font gömmeyi geçersiz kılmaz

data: kaynakları ve callback sonuçları, MaxResources, MaxResourceBytes ve MaxTotalResourceBytes limitlerini paylaşır

MaxDecodedImageBytes varsayılan olarak 128 MiB'dir ve çözülen image önbelleğini piksel başına dört baytla bağımsız olarak sınırlar; BMP ve PNG boyutları çözmeden önce denetlenir, kabul edilen her resim tutulmadan önce denetlenir

MaxDOMNodes, MaxCSSRules ve MaxLayoutOperations; parsing, cascade kurma ve layout işini bağımsız olarak sınırlar

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

İstatistikler

THPDFHTMLImportStatistics; profile sürümünü, ayrıştırılan node'ları, CSS rule'larını, layout işlemlerini, page break'leri, tabloları, form kontrollerini, kaynak isteklerini, kabul edilen ve reddedilen yüklemeleri, kabul edilen kaynak baytlarını, ölçülen metin satırlarını, hecelenen satırları, teşhisleri, flex container'ları ve grid container'ları bildirir

OnLineLayout, gerçek PDF metni yazıldıktan sonra satırın sıfır tabanlı sayfa ve paragraf satır indekslerini, orijinini, ölçülen genişlik ve yüksekliğini, mantıksal metnini, yönünü ve heceleme bayrağını alır

Her RenderHTML5 çağrısı istatistik kaydını sıfırlar ve bütçe ihlalleri EHPDFHTMLImportBudget fırlatır

Örnek

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;

Ayrıca bkz: THPDFPage.TextOutHTML, Bildirimsel Layout DOM, AcroForm Desteği