DOM של פריסה דקלרטיבית

HPDFLayoutDOM בונה רכיבי מסמך לשימוש חוזר על גבי THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, שברי הצפה בבעלות עצמית ו-ImmediateFlushLayout

הרכב מסמך ומקטע

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 הוא הבעלים של המקטעים שלו, כל THPDFDOMSection הוא הבעלים של גוף, כותרת עליונה, כותרת תחתונה וסגנון, וכל ערימה או מאגר הם הבעלים של הרכיבים המחוברים אליהם

THPDFDOMRenderer.Render מתחיל ומסיים את מסמך היעד, יוצר עמוד חדש לכל מקטע חדש, חוזר על רהיטי המקטע בעמודי המשך, ומחזיר סטטיסטיקות של עמודים, שיבוץ, פיצולים, רהיטים, מבנה, תוכן מסומן, אובייקטים מלאכותיים ועומק המשך מרבי

הגדר את כל אפשרויות הפלט, הדחיסה, ה-conformance, השכבות וה-flush המיידי של THotPDF לפני הקריאה ל-Render

GenerateStructure מקבל כברירת מחדל את הערך True, כך שהמרנדר בונה בנוסף עץ מבנה לוגי בטוח להמשך ומשתמש ב-THPDFDOMDocument.Language כשאין ליעד שפה

רכיבים

כל הרכיבים חושפים חוזים יציבים של Name, Path, Style, Clone, Measure, Draw ו-Split, ובנוסף תפקיד סמנטי, שפה, טקסט חלופי, טקסט תחלופי, טקסט הרחבה ובטלות אובייקט מלאכותי

מעבר הגוף ברמה העליונה הוא ליניארי ואינו משבט רכיבים; המשכי טקסט וטבלה שומרים מטא-נתונים של טווח או פרוסת שורות במקום להעתיק את עץ התוכן המלא

ירושת סגנון

THPDFDOMStyle פותר את שם הגופן, הגודל, הסגנונות, צבע הטקסט, הרקע, הגבול, הריפוד, המרווח וגובה השורה דרך שרשרת ההורים שלו

סגנון מקטע הוא ההורה של גופו ורהיטיו, סגנון ערימה או מאגר הוא ההורה של ילדיו, והסגנון של טבלה זורם דרך שורות אל תאים

רק ערכים שהוקצו במפורש דורסים את ההורה; Clear מסיר הקצאות מקומיות ואת קישור ההורה, בעוד Assign מעתיק הקצאות מקומיות בלי להעתיק בעלות או שושלת

שרשראות הורים בעומק גדול מ-64 רמות נדחות כמחזוריות או בלתי מוגבלות

מפעלי רכיבים לשימוש חוזר

THPDFDOMComponentFactory הוא פונקציה אנונימית היוצרת מופע THPDFDOMComponent אחד בבעלות המתקשר לכל קריאה

Document.RegisterComponent('notice',
  function: THPDFDOMComponent
  begin
    Result := THPDFDOMContainer.Create(
      THPDFDOMText.Create('Reusable notice'));
  end);

Section.Body.Add(Document.CreateComponent('notice'));

שמות המפעלים אינם תלויים ברישיות והם ייחודיים, כל קריאה חייבת להחזיר מופע רכיב חדש, והמאגר המקבל לוקח בעלות אחרי Add

השתמש ב-SetHeaderClone, SetFooterClone או Clone כשצריך לעשות שימוש חוזר ברכיב שהוכרז אחד באתרי בעלות אחדים

טבלאות עם כותרות חוזרות

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);

שורות הכותרת חייבות להיות רצופות ולקדם את שורות הגוף, משקלי עמודות חיוביים מחלקים את הרוחב הזמין, וגובהה של שורה הוא ערך חיובי מפורש

כש-RepeatHeaders נכון, פיצול דורש מקום לכל שורות הכותרת המובילות ולשורת גוף אחת לפחות, מה שמונע עמודי המשך הכוללים כותרת בלבד

פניאה וגבולות כשל

המרנדר מודד תחילה מחדש כל רכיב מול מלבן הגוף הנותר, מעביר פרגמנט מינימלי שאינו ניתן לפיצול לעמוד חדש כשהוא אפשרי, ומפקיד כל פיצול תקין בידי PlaceLayoutElement

רכיב שאינו יכול להיכנס לעמוד גוף ריק מעלה חריגה עם מסלול הרכיב היציב שלו במקום להשליך תוכן בשקט

MaximumContinuationDepth מקבל כברירת מחדל את הערך 100,000 ותוחם רכיבים פגומים שחוזרים שוב ושוב על המשך שאינו מתקדם

ממדיו של עמוד המקטע חייבים להיות חיוביים, מרווחים ופערי רהיטים אינם יכולים להיות שליליים, והגיאומטריה של כותרת עליונה וכותרת תחתונה חייבת להשאיר מלבן גוף חיובי

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 שנוצר מייצא את אותם משטחי מסמך, סגנון, רכיב, טבלה, מקטע, מרנדר וסטטיסטיקות

ממשקי API קשורים