Bildirimsel Layout DOM
HPDFLayoutDOM; THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, sahipli taşma parçaları ve ImmediateFlushLayout üzerinde yeniden kullanılabilir belge bileşenleri kurar
Belge ve bölüm oluşturma
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 bölümlerinin sahibidir; her THPDFDOMSection kendi body, header, footer ve stilinin, her stack veya container ise kendine eklenen bileşenlerin sahibidir
THPDFDOMRenderer.Render hedef belgeyi başlatır ve bitirir, her yeni bölüm için taze bir sayfa açar, bölüm furniture'ını devam sayfalarında tekrarlar ve sayfa, yerleştirme, bölünme, furniture, yapı, marked-content, artifact ve maksimum devam istatistiklerini döndürür
Render'ı çağırmadan önce tüm THotPDF çıktı, sıkıştırma, conformance, katman ve immediate-flush seçeneklerini ayarlayın
GenerateStructure varsayılan olarak True'dur; bu yüzden renderer, devamlılık açısından güvenli bir mantıksal yapı ağacı da kurar ve hedefin dili yokken THPDFDOMDocument.Language değerini kullanır
Bileşenler
THPDFDOMText, Unicode metni sarar; satır sınırlarını genişliğe ve devralınan metin metric'lerine göre önbellekler ve kaynak metni kopyalamadan kaynak karakter aralıkları üzerinden bölünürTHPDFDOMSpacerdikey alan ayırır ve sayfalar arasında bölünebilirTHPDFDOMStack, sahip olduğu alt bileşenleri devralınan padding ve spacing ile dikey dizilirTHPDFDOMContainer, sahip olduğu tek bir alt bileşenin çevresine stilli bir kutu ekler ve bölünme devamlarını iletirTHPDFDOMTableağırlıklı sütunları çözer, stilli satır ve hücreleri çizer ve öndeki header satırlarını devam sayfalarında tekrarlarTHPDFDOMList, etiket ve gövde bileşenleriyle numaralı veya numarasız liste öğeleri oluştururTHPDFDOMImage, klonlanmış bir grafiğin sahibidir; açık boyutları çözer ve figure semantiği ile sıkıştırma denetimi sağlar
Tüm bileşenler; kararlı Name, Path, Style, Clone, Measure, Draw ve Split sözleşmelerini, ayrıca semantic role, dil, alternatif metin, replacement metni, expansion metni ve artifact override'larını açığa çıkarır
Üst düzey body dolaşımı doğrusaldır ve bileşen klonlamaz; metin ve tablo devamları, içerik ağacının tamamını kopyalamak yerine aralık veya satır dilimi meta verisini saklar
Stil kalıtımı
THPDFDOMStyle; yazı tipi adını, boyutu, stilleri, metin rengini, arka planı, kenarlığı, padding'i, spacing'i ve satır yüksekliğini üst zinciri üzerinden çözer
Bölüm stili, body'sinin ve furniture'ının üstüdür; stack veya container stili, alt bileşenlerinin üstüdür; tablo stili ise satırlardan hücrelere akar
Yalnızca açıkça atanan değerler üstü ezer; Clear yerel atamaları ve üst bağını kaldırır, Assign ise sahiplği veya soyu kopyalamadan yerel atamaları kopyalar
64 seviyeden derin üst zincirleri döngüsel veya sınırsız olarak reddedilir
Yeniden kullanılabilir bileşen factory'leri
THPDFDOMComponentFactory, her çağrıda çağıranın sahipliğinde tek bir THPDFDOMComponent örneği oluşturan anonim bir fonksiyondur
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Factory isimleri büyük/küçük harf duyarsız ve tekildir; her çağrı yeni bir bileşen örneği döndürmelidir ve alan container, sahipliği Add sonrasında üstlenir
Bildirilen bir bileşenin birden fazla sahiplik noktasında yeniden kullanılması gerektiğinde SetHeaderClone, SetFooterClone veya Clone kullanın
Tekrarlayan header'lı tablolar
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);
Header satırları bitişik olmalı ve body satırlarından önce gelmelidir; pozitif sütun ağırlıkları kullanılabilir genişliği böler, satır yükseklikleri açık pozitif değerlerdir
RepeatHeaders true olduğunda bir bölünme, tüm öndeki header satırlarına ve en az bir body satırına yer ister; böylece yalnızca header içeren devam sayfaları engellenir
Sayfalandırma ve hata sınırları
Renderer önce her bileşeni kalan body dikdörtgenine göre yeniden ölçer, bölünemeyen en küçük parçayı mümkünse taze bir sayfaya taşır ve her geçerli bölünmeyi PlaceLayoutElement'e devreder
Boş bir body sayfasına sığamayan öğe, içeriği sessizce atmak yerine kararlı öğe yoluyla bir exception fırlatır
MaximumContinuationDepth varsayılan olarak 100.000'dir ve sürekli ilerlemeyen bir devam döndüren hatalı biçimli bileşenleri sınırlar
Bölüm sayfa boyutları pozitif olmalıdır; kenar boşlukları ve furniture boşlukları negatif olamaz, header ve footer geometrisi pozitif bir body dikdörtgeni bırakmalıdır
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());
Üretilen HPDFLayoutDOM.hpp, aynı belge, stil, bileşen, tablo, bölüm, renderer ve istatistik yüzeylerini dışa aktarır