ניהול מסמכים
ניהול מסמכים
Document הוא נקודת הכניסה לכל פעולה של ניהול מסמכים שמכוסה כאן: פתיחה ושמירת קבצים, ייצוא ל-HTML, הוספת שכבות תוכן אופציונליות, יצירת Tagged PDF, וקריאה או כתיבה של נתוני AcroForm. Page ו-Form נגישים דרך Document.Page(n) ו-Document.Form().
פתיחה ושמירת מסמכים
pdf.Open טוען קובץ PDF ממסלול קובץ; pdf.OpenWithPassword עושה זאת עבור קבצים המוגנים בסיסמה. Document.Save כותב את התוצאה למסלול קובץ חדש.
doc, err := pdf.Open("input.pdf")
if err != nil {
panic(err)
}
_, err = pdf.OpenWithPassword("locked.pdf", "userpassword")
if err != nil {
panic(err)
}
err = doc.Save("output.pdf")ייצוא ל-HTML
Document.SaveHTML ו-Document.WriteHTML ממירים מסמך ל-HTML. HTMLSaveOptions.Mode בוחר את הייצוג: HTMLModeText (טקסט מעוצב נראה על רקע רסטר ללא גליפים), HTMLModeNative (גרפיקת עמוד כשכבת SVG אינליין אחת), או HTMLModeFlow (HTML זורם מחדש עם כותרות ופסקאות בסדר הקריאה). השארת Mode ללא הגדרה מייצרת את ברירת המחדל הנאמנה: רסטר מלא של העמוד עם שכבת טקסט ניתנת לבחירה ושקופה.
doc, _ := pdf.Open("input.pdf")
// Faithful mode (default)
doc.SaveHTML("out.html")
// Visible-text mode
doc.SaveHTML("out.html", pdf.HTMLSaveOptions{Mode: pdf.HTMLModeText})
// Multi-file output: external resources plus one HTML file per page
doc.SaveHTML("site/doc.html", pdf.HTMLSaveOptions{
Mode: pdf.HTMLModeNative, ResourceDir: "assets", SplitPages: true,
})
// Page subset, custom raster DPI and title
doc.SaveHTML("part.html", pdf.HTMLSaveOptions{Pages: []int{1, 3}, DPI: 96, Title: "Report"})ניהול שכבות תוכן אופציונליות
Document.AddLayer(name) יוצר קבוצה אופציונלית של תוכן חדשה ומחזיר *Layer; Document.Layers() מציג את כל השכבות שכבר קיימות. Page.BeginLayer / Page.EndLayer מסמנים את תוכן הדף כשייך לשכבה, ו-Layer.SetVisible(false) מסתיר את התוכן.
doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)
layer := doc.AddLayer("Watermark")
page, _ := doc.Page(1)
page.BeginLayer(layer)
page.AddText("DRAFT", pdf.TextStyle{Font: pdf.FontHelveticaBold, Size: 48},
pdf.Rectangle{LLX: 150, LLY: 400, URX: 450, URY: 460})
page.EndLayer()
layer.SetVisible(false)
doc.Save("layered.pdf")בניית קבצי PDF מתוייגים (נגישים)
Document.TaggedContent() מחזיר את המעטפת *TaggedContent שבבעלותה עץ המבנה הלוגי של המסמך ומגדיר את מטא-נתוני הקטלוג כפי ש-PDF/UA דורש. Page.TagContent משגר קריאת ציור בתוכן מסומן ומחזיר *StructElement עבור הצומת הזאת.
doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)
tc := doc.TaggedContent()
tc.SetTitle("Quarterly Report")
tc.SetLanguage("en-US")
page, _ := doc.Page(1)
page.TagContent(tc.Root(), pdf.StructH1, func() error {
return page.AddText("Quarterly Report", pdf.TextStyle{Font: pdf.FontHelveticaBold, Size: 24},
pdf.Rectangle{LLX: 50, LLY: 760, URX: 545, URY: 800})
})
fig, _ := page.TagContent(tc.Root(), pdf.StructFigure, func() error {
return page.AddImage("chart.png", pdf.Rectangle{LLX: 50, LLY: 540, URX: 300, URY: 680})
})
fig.SetAlt("Bar chart of Q3 sales by region") // required for figures
doc.Save("accessible.pdf")קיבוץ אלמנטים מתמקמים גם תחת שורש העץ:
doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)
tc := doc.TaggedContent()
page, _ := doc.Page(1)
tbl := tc.Root().AddChild(pdf.StructTable)
row := tbl.AddChild(pdf.StructTR)
cell := row.AddChild(pdf.StructTD)
page.TagContent(cell, pdf.StructP, func() error { return nil })ייצוא וייבוא של נתוני טופס כ-JSON
Form.ExportJSON מסדרת כל סוג שדה וערך ל-JSON ({"name": {"type": "text", "value": "Jane"}, ...}); Form.ImportJSON מחילה עומס JSON על טופס ומחזירה את מספר השדות שהעדכן. JSONExportOptions.Indent מדפיסה את הפלט בצורה קריאה.
doc, _ := pdf.Open("filled.pdf")
data, _ := doc.Form().ExportJSON(pdf.JSONExportOptions{Indent: true})
// Fill a template from a JSON payload; discard the applied-field count.
template, _ := pdf.Open("template.pdf")
_, _ = template.Form().ImportJSON(data)טיפים ושיטות עבודה מומלצות
- בחרו ב-
HTMLModeNativeלדפים בעלי משקל וקטורי גבוה, ב-HTMLModeFlowלקריאה עם זרימה מחדש/ניידת, ובברירת המחדל הנאמנה (בלי להגדירMode) כאשר חשובה ביותר האמינות החזותית. - הקרא ל-
Layer.SetVisible(false)לפניSaveכדי להסתיר שכבות סימן מים או הערות כברירת מחדל תוך שמירה על האפשרות לגשת לתוכן דרך האובייקטLayer. - הגדר את
TaggedContent.SetTitleו-SetLanguageלפני קריאתPage.TagContent, מכיוון שהאימות PDF/UA בודק את המטה-נתונים ברמת הקטלוג שהשיטות הללו כותבות. - הקרא ל-
StructElement.SetAltבכל צומתStructFigure— ציורים ללא טקסט חלופי נכשלים באימות PDF/UA. - השתמש ב-
JSONExportOptions.Indentלצורך השוואה קריאה לבני אדם של מצב הטופס המיוצא; השמט אותו עבור מטענים קומפקטיים בין-מכונה-ל-מכונה.
בעיות נפוצות
| בעיה | סיבה | תיקון |
|---|---|---|
| HTML הפלט אינו מכיל גליפים של טקסט שניתן לבחור | HTMLSaveOptions.Mode נשאר בברירת המחדל הנאמנה ללא דרישת שכבת טקסט | הגדר Mode: pdf.HTMLModeText עבור שכבת טקסט גלויה ומעוצבת |
| הייצוא של HTML מאבד את המראה של הגופן המקורי | NoFontEmbedding מוגדר ל true | השאר את NoFontEmbedding false (ברירת מחדל) כך שהגופנים המוטמעים יועטפו מחדש ככתובות URL של נתוני WOFF @font-face |
Page.TagContent מחזיר שגיאה | קרא לפני ש-Document.TaggedContent() אתחלה את עץ המבנה | הפעל Document.TaggedContent() (והגדר כותרת/שפה) לפני הקריאה הראשונה ל-TagContent |
ValidatePDFUA מדווח על אי-התאמה של איורים | אלמנט StructFigure חסר טקסט alt | הפעל StructElement.SetAlt על כל צומת של איור |
Form.ImportJSON מעדכן פחות שדות מהצפוי | שמות השדות של העומס של JSON אינם תואמים לשמות השדות בטופס היעד; הייבוא סובלן ומדלג על ערכים שלא תואמים | אשר ששמות השדות המיוצאים תואמים בדיוק לשמות השדות של טופס היעד |
FAQ
איזה HTML מצב ייצוא עלי לבחור?
HTMLModeText עבור הפלט הקטן ביותר, שניתן לבחור בו במלואו; HTMLModeNative כאשר דיוק הווקטור (עקומות, קווים טבעיים) חשוב יותר מגודל הקובץ; HTMLModeFlow עבור פריסת קריאה ניתנת לשינוי, ידידותית למובייל. השאר Mode ללא הגדרה עבור ברירת המחדל של רסטר עם טקסט שקוף מדויק.
האם אוכל לייצא רק דפים ספציפיים ל HTML?
כן. הגדר את HTMLSaveOptions.Pages לרצף של מספרי דפים שמתחילים מ-1, למשל pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.
איך להסתיר שכבה כברירת מחדל אך לאפשר לצופה להפעילה מחדש?
קרא לLayer.SetVisible(false) לפני השמירה. השכבה נשארת קבוצה של תוכן אופציונלי שניתן לגשת אליה; Layer.IsVisible() מדווחת על המצב הנוכחי שלה.
האם ייצוא הטופס JSON כולל סוגי שדות?
כן. כל שדה מיוצא הוא אובייקט JSON עם מפתחות type ו-value, לדוגמה {"subscribe": {"type": "checkbox", "value": true}}.
האם צריך לקרוא ל TagContent עבור כל אלמנט, או שניתן לקבץ קבוצות ישירות?
שניהם. Page.TagContent עוטף קריאת ציור ומוסיף אלמנט של מבנה עלה. כדי לקבץ אלמנטים (טבלאות, רשימות), קרא לStructElement.AddChild על שורש העץ או על אלמנט אב כדי לבנות את הקיבוץ תחילה, ואז תייג את תוכן העלה מתחתיו.
API Reference סיכום
| מחלקה/מתודה | תיאור |
|---|---|
Document.SaveHTML / WriteHTML | ייצא את המסמך ל-HTML, נשלט על ידי HTMLSaveOptions |
HTMLSaveOptions | HTML תצורת ייצוא: מצב, DPI, תת-קבוצת דפים, טיפול במשאבים |
Document.AddLayer / Layers | צור או רשום קבוצות תוכן אופציונליות במסמך |
Page.BeginLayer / EndLayer | סמן את תוכן העמוד כמשויך לשכבה |
Layer | קבוצת תוכן אופציונלית — שם ונראות |
Document.TaggedContent | חזית עבור עץ המבנה הלוגי של המסמך (PDF מתויג) |
TaggedContent | מגדיר את כותרת/שפת המסמך ומחשוף את שורש עץ המבנה |
Page.TagContent / TagArtifact | קריאות ציור בסוגריים בתוכן מסומן ובאלמנטים של המבנה |
StructElement | צומת בעץ המבנה הלוגי — ילדים, טקסט חלופי, שפה |
Form.ExportJSON / ImportJSON | לסריאליזציה או ליישום של נתוני השדה AcroForm כ-JSON |
JSONExportOptions | תצורת ייצוא JSON: הזחה, השמטת-ריק |