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 כשאין ליעד שפה
רכיבים
THPDFDOMTextעוטם טקסט Unicode, שומר קצוות שורות במטמון לפי רוחב ומדדים מועברים, ומפצל לפי טווחי תווים במקור בלי להעתיק את טקסט המקורTHPDFDOMSpacerשומר מקום אנכי ויכול להתפצל על פני עמודיםTHPDFDOMStackמניח ילדים בבעלותו אנכית עם ריפוד ומרווח מועבריםTHPDFDOMContainerמוסיף תיבה מעוצבת סביב ילד אחד בבעלותו ומעביר רצפי המשך של פיצולTHPDFDOMTableפותר עמודות משוקללות, מצייר שורות ותאים מעוצבים, וחוזר על שורות הכותרת המובילות בעמודי המשךTHPDFDOMListיוצר פריטי רשימה ממוספרים או בלתי ממוספרים עם רכיבי תווית וגוףTHPDFDOMImageהוא הבעלים של גרפיקה משובטת, פותר ממדים מפורשים, ומספק סמנטיקת איור ושליטה בדחיסה
כל הרכיבים חושפים חוזים יציבים של 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 שנוצר מייצא את אותם משטחי מסמך, סגנון, רכיב, טבלה, מקטע, מרנדר וסטטיסטיקות