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
- DOM yang toleran menerima tag akhir yang umumnya dihilangkan, mempertahankan urutan teks, melewati wilayah dokumen yang tidak aktif, dan menegakkan
MaxDOMNodes - Kaskade mendukung pemilih tipe, kelas, ID, atribut, dan turunan, urutan sumber, spesifisitas, deklarasi inline,
!important,@media print, dan margin@page - Tata letak berhalaman mendukung aliran blok, judul, daftar, batas, latar belakang, jarak kotak, pemutusan halaman eksplisit, tabel, gambar, dan paginasi luapan otomatis
- Input teks, tombol, kotak centang, tombol radio, area teks, dan kontrol pilih dirender sebagai tampilan statis atau field AcroForm asli saat
CreateAcroFormsdiaktifkan
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