Impor Media Berhalaman HTML5

THPDFHTMLImporter.RenderHTML5 mengonversi markup HTML5 yang toleran dan CSS cetak menjadi konten PDF berhalaman sambil mempertahankan jalur RenderHTML lama yang ringkas

Panjang CSS serta Margin, BaseFontSize, ListIndent, dan BlockSpacing milik importer dinyatakan dalam points, jadi kedua renderer menghasilkan halaman yang sama berapa pun THotPDF.Resolution-nya; gambar Anda sendiri sebelum dan sesudah impor tetap memakai 1/Resolution inci

Deklarasi

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;

Kontrak profil

HTML5ProfileVersion mengembalikan 1 dan HTML5ProfileMilestones melaporkan parser dan kaskade, tata letak berhalaman, tabel dan formulir, serta resource yang dibatasi

Paragraf terukur dan arah

Paragraf di-wrap memakai advance terukur font saat ini, termasuk pergantian font, run bold dan italic, letter spacing, word spacing, line break eksplisit, dan batas karakter Asia Timur; perataan dan dekorasi diterapkan terpisah pada setiap baris hasilnya

direction: ltr, direction: rtl, dan atribut HTML dir memilih arah paragraf; dir="auto" memakai arah Unicode karakter strong pertama

Di Windows, run skrip bidireksional di-resolve dengan Uniscribe dan diurutkan ulang melintasi batas gaya, sementara engine teks PDF yang sudah ada menangani shaping glyph di dalam setiap run; arah dokumen, viewer preferences, dan state teks halaman yang disimpan dipulihkan setelah barisnya

Override arah inline, bdi, dan bdo saat ini memakai pengurutan paragraf dan menghasilkan diagnostik hdkLayoutFallback; unicode-bidi berada di luar profil ini, dan shaping skrip tetap mengikuti konfigurasi shaping dokumen

Fragmentasi paragraf

widows dan orphans adalah integer positif yang diwarisi, keduanya default-nya 2; paginasi memakai line box terukur, bukan perkiraan jumlah karakter

Importer memindahkan paragraf atau menyetel ulang pemecahannya agar jumlah baris minimum yang diminta tersisa sebelum dan sesudah page break; break-inside: avoid menjaga paragraf tetap utuh ketika muat di halaman baru

Ketika satu halaman tidak bisa memuat constraint yang diminta, rendering tetap berjalan dengan melonggarkan constraint dan mencatat hdkPaginationConstraint; setiap fragmen halaman menerima background dan border miliknya sendiri

Hyphenation opsional

hyphens: none menekan pemenggalan diskresioner, dan default hyphens: manual memakai U+00AD atau ­; hyphen yang terlihat hanya dipancarkan ketika titik penggal yang dipilih benar-benar terpakai

hyphens: auto tambahan memanggil OnHyphenate dengan kata dan nilai HTML lang yang diwarisi; tanpa callback, break manual tetap berlaku dan dilaporkan sebagai layout fallback, karena tidak ada dictionary bahasa yang dibundel

Posisi break menghitung unit kode UTF-16 dari awal kata; posisi yang tidak valid, di luar jangkauan, membelah surrogate, atau membelah combining mark dasar diabaikan

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

Kotak flex dan grid terbatas

display: flex mendukung row, row-reverse, column, dan column-reverse; children baris memakai lebar eksplisit atau berbagi sisa lebar, dan nilai flex-grow positif membagi ruang tambahan secara berbobot

Baris mendukung justify-content start, end, center, space-between, space-around, dan space-evenly, plus perataan cross-axis start, end, center, dan stretch; aliran column mendukung tata letak vertikal natural dan mengeluarkan diagnostik untuk distribusi tinggi-tetap maupun perataan cross-axis yang tidak didukung

display: grid mendukung column track berpanjang-tetap positif dan fr, termasuk repeat(n, tracks) terbatas sampai 64 kolom; sel ditempatkan dalam urutan sumber, mengisi satu baris pada satu waktu

grid-column: span N dan grid-column-end: span N mengizinkan satu child menempati track berurutan beserta gap di antaranya; item yang tidak muat di baris saat ini pindah ke baris berikutnya, dan span yang lebih besar dari jumlah track menghasilkan layout fallback

flex-wrap: wrap memulai baris baru ketika lebar eksplisit dan gap item berikutnya tidak muat; setiap baris menerapkan flex-grow dan justify-content secara independen, sementara row-reverse dan RTL membalik posisi di dalam setiap baris tanpa memindahkan item antar baris

gap menerima satu atau dua panjang, dengan override row-gap dan column-gap yang independen; baris paralel tetap di satu halaman dan diperiksa sebelum digambar

Children paralel mendukung blok teks dengan styling inline, container blok biasa yang bersarang secara rekursif dengan padding, border, dan background, container flex serta grid bersarang, gambar, dan kontrol form statis maupun native

Gambar memakai byte yang disuplai callback atau data URI, mempertahankan rasio aspek intrinsiknya ketika tinggi tidak dispesifikkan, dan di-decode sekali per node DOM; preflight dan fallback memakai ulang gambar cache yang sama tanpa menghabiskan permintaan resource baru

Semua child box diukur sebelum baris paralel mana pun digambar, sehingga konten yang tidak didukung atau terlalu besar kembali ke aliran halaman vertikal tanpa mengulang baris yang sudah digambar; perencanaan bersarang dibatasi 64 level dan menghabiskan budget layout-operation yang ada

Children yang di-wrap tanpa lebar eksplisit menempati satu baris penuh; tabel dan daftar di dalam children paralel, flex basis dan shrink, wrap-reverse, intrinsic track sizing, grid row track dan row span, serta penempatan grid eksplisit tetap di luar profil ini dan menghasilkan diagnostik yang bisa diamati

Diagnostik CSS yang tidak didukung

Diagnostics mengekspos record yang memuat Kind, Subject, Value, dan MessageText; OnDiagnostic menerima informasi yang sama selama rendering

Properti yang tidak dikenal, nilai yang tidak didukung, selector yang tidak didukung, dan at-rule yang tidak didukung diabaikan dengan diagnostik, termasuk deklarasi di dalam rule stylesheet yang tidak terpakai; pseudo selector dilewati alih-alih diperlakukan sebagai type selector biasa

StrictCSS, yang default-nya nonaktif, melempar EHPDFHTMLUnsupportedCSS saat ada diagnostik; konten sebelumnya mungkin sudah terlanjur dipancarkan, jadi pemanggil yang menuntut impor all-or-nothing sebaiknya memakai dokumen terpisah

MaxDiagnostics default-nya 256 dan membatasi record yang disimpan; DiagnosticCount dan pengiriman callback tetap dapat diamati setelah batas penyimpanan tercapai, dan limit non-positif menonaktifkan penyimpanan record

Resource yang dibatasi

Lembar gaya, gambar, dan font @font-face eksternal dinonaktifkan kecuali OnResource menyediakan byte-nya, sehingga impor HTML tidak pernah membuka file atau koneksi jaringan secara implisit

@font-face mendukung satu sumber url(...), format('truetype') atau format('opentype') opsional, alias family, gaya normal atau italic, dan weight normal, bold, 400, atau 700; font-display menerima kebijakan standar karena impor offline memuat resource secara sinkron

Font harus berupa resource TrueType atau OpenType sfnt yang dapat di-embed dengan nama family Windows ASCII maksimum 31 karakter; WOFF, font collection, local(...), descriptor variabel, dan daftar sumber menghasilkan diagnostik

Font yang diterima didaftarkan secara privat di memori proses di Windows dan tetap dimiliki dokumen sampai dokumen dihancurkan, jadi melepas importer sebelum EndDoc tidak membatalkan embedding font yang ditunda

Resource data: dan hasil panggilan balik berbagi batas MaxResources, MaxResourceBytes, dan MaxTotalResourceBytes

MaxDecodedImageBytes default-nya 128 MiB dan secara independen membatasi cache gambar hasil decode pada empat byte per piksel; dimensi BMP dan PNG diperiksa sebelum decode, dan setiap gambar yang diterima diperiksa sebelum disimpan

MaxDOMNodes, MaxCSSRules, dan MaxLayoutOperations membatasi penguraian, pembangunan kaskade, dan kerja tata letak secara independen

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

Statistik

THPDFHTMLImportStatistics melaporkan versi profil, simpul yang diurai, aturan CSS, operasi tata letak, pemutusan halaman, tabel, kontrol formulir, permintaan resource, muatan yang diterima dan ditolak, byte resource yang diterima, baris teks terukur, baris yang di-hyphenate, diagnostik, container flex, dan container grid

OnLineLayout menerima indeks halaman dan baris paragraf berbasis nol milik baris tersebut, origin, lebar dan tinggi terukur, teks logis, arah, dan flag hyphenation setelah teks PDF yang sebenarnya dipancarkan

Setiap panggilan RenderHTML5 mengatur ulang rekaman statistik, dan pelanggaran anggaran memunculkan EHPDFHTMLImportBudget

Contoh

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;

Lihat juga: THPDFPage.TextOutHTML, DOM Tata Letak Deklaratif, Dukungan AcroForm