DOM Tata Letak Deklaratif
HPDFLayoutDOM membangun komponen dokumen yang dapat digunakan kembali di atas THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, fragmen overflow yang dimiliki, dan ImmediateFlushLayout
Komposisi dokumen dan bagian
Document := THPDFDOMDocument.Create;
Renderer := THPDFDOMRenderer.Create;
try
Section := Document.AddSection;
Section.PageWidth := 595.28;
Section.PageHeight := 841.89;
Section.Header := THPDFDOMText.Create('Quarterly report');
Section.Footer := THPDFDOMText.Create('Confidential');
Section.Body.Style.Padding := 12;
Section.Body.Style.Spacing := 8;
Section.Body.AddText(BodyText, 'Narrative');
PDF.OutputStream := Output;
PDF.ImmediateFlushLayout := True;
Statistics := Renderer.Render(Document, PDF);
finally
Renderer.Free;
Document.Free;
end;
THPDFDOMDocument memiliki bagian-bagiannya, setiap THPDFDOMSection memiliki body, header, footer, dan gayanya, dan setiap stack atau kontainer memiliki komponen yang dilampirkan padanya
THPDFDOMRenderer.Render memulai dan mengakhiri dokumen target, membuat halaman baru untuk setiap bagian baru, mengulang furnitur bagian pada halaman kelanjutan, dan mengembalikan statistik halaman, penempatan, pemecahan, furnitur, struktur, konten bertanda, artifact, dan kelanjutan maksimum
Setel semua opsi keluaran, kompresi, kesesuaian, lapisan, dan immediate-flush THotPDF sebelum memanggil Render
GenerateStructure default-nya True, sehingga renderer juga membangun pohon struktur logis yang aman untuk kelanjutan dan menggunakan THPDFDOMDocument.Language ketika target tidak memiliki bahasa
Komponen
THPDFDOMTextmembungkus teks Unicode, meng-cache batas baris berdasarkan lebar dan metrik teks yang diwarisi, dan memecah melalui rentang karakter sumber tanpa menyalin teks sumberTHPDFDOMSpacermencadangkan ruang vertikal dan dapat terpecah di beberapa halamanTHPDFDOMStackmenata anak yang dimiliki secara vertikal dengan padding dan spacing yang diwarisiTHPDFDOMContainermenambahkan kotak bergaya di sekitar satu anak yang dimiliki dan meneruskan kelanjutan pemecahanTHPDFDOMTablemenyelesaikan kolom berbobot, menggambar baris dan sel bergaya, dan mengulang baris header terdepan pada halaman kelanjutanTHPDFDOMListmembuat item list bernomor atau tidak bernomor dengan komponen label dan bodyTHPDFDOMImagememiliki grafik klon, menyelesaikan dimensi eksplisit, dan menyediakan semantik figure dan kontrol kompresi
Semua komponen mengekspos kontrak Name, Path, Style, Clone, Measure, Draw, dan Split yang stabil plus penimpaan peran semantik, bahasa, teks alternatif, teks pengganti, teks ekspansi, dan artifact
Traversal body tingkat atas bersifat linier dan tidak mengkloning komponen; kelanjutan teks dan tabel mempertahankan metadata rentang atau irisan baris alih-alih menyalin pohon konten lengkap
Warisan gaya
THPDFDOMStyle menyelesaikan nama font, ukuran, gaya, warna teks, latar belakang, border, padding, spacing, dan tinggi baris melalui rantai induknya
Gaya bagian adalah induk dari body dan furniturnya, gaya stack atau kontainer adalah induk dari anak-anaknya, dan gaya tabel mengalir melalui baris ke sel
Hanya nilai yang ditetapkan eksplisit yang menimpa induk; Clear menghapus penugasan lokal dan tautan induk, sementara Assign menyalin penugasan lokal tanpa menyalin kepemilikan atau leluhur
Rantai induk lebih dalam dari 64 tingkat ditolak sebagai siklik atau tak terbatas
Pabrik komponen yang dapat digunakan kembali
THPDFDOMComponentFactory adalah fungsi anonim yang membuat satu instance THPDFDOMComponent milik pemanggil per pemanggilan
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Nama pabrik tidak membedakan huruf besar/kecil dan unik, setiap panggilan harus mengembalikan instance komponen baru, dan kontainer penerima mengambil kepemilikan setelah Add
Gunakan SetHeaderClone, SetFooterClone, atau Clone ketika satu komponen yang dideklarasikan harus digunakan kembali di beberapa situs kepemilikan
Tabel header berulang
Table := THPDFDOMTable.Create('Orders');
Table.AddColumn(1);
Table.AddColumn(3);
Header := Table.AddRow(18, True);
Header[0].Text := 'ID';
Header[1].Text := 'Description';
Row := Table.AddRow(22);
Row[0].Text := '1001';
Row[1].Text := 'Bounded streaming layout';
Section.Body.Add(Table);
Baris header harus berurutan dan mendahului baris body, bobot kolom positif membagi lebar yang tersedia, dan tinggi baris adalah nilai positif eksplisit
Ketika RepeatHeaders true, pemecahan memerlukan ruang untuk semua baris header terdepan dan setidaknya satu baris body, mencegah halaman kelanjutan hanya-header
Paginasi dan batas kegagalan
Renderer pertama-tama mengukur ulang setiap komponen terhadap persegi panjang body yang tersisa, memindahkan fragmen minimum yang tidak dapat dipecah ke halaman baru ketika memungkinkan, dan mendelegasikan setiap pemecahan valid ke PlaceLayoutElement
Elemen yang tidak dapat muat di halaman body kosong memunculkan pengecualian dengan jalur elemen stabilnya alih-alih membuang konten secara senyap
MaximumContinuationDepth default-nya 100.000 dan membatasi komponen salah bentuk yang berulang kali mengembalikan kelanjutan yang tidak berkembang
Dimensi halaman bagian harus positif, margin dan celah furnitur tidak boleh negatif, dan geometri header plus footer harus meninggalkan persegi panjang body positif
C++Builder
std::unique_ptr<THPDFDOMDocument> document(new THPDFDOMDocument());
THPDFDOMSection* section = document->AddSection();
section->Header = new THPDFDOMText(L"Report", "Header");
section->Body->AddText(L"Declarative content", "BodyText");
std::unique_ptr<THPDFDOMRenderer> renderer(new THPDFDOMRenderer());
THPDFDOMRenderStatistics statistics =
renderer->Render(document.get(), pdf.get());
HPDFLayoutDOM.hpp yang dihasilkan mengekspor permukaan dokumen, gaya, komponen, tabel, bagian, renderer, dan statistik yang sama