การจัดการเอกสาร
การจัดการเอกสาร
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 (ข้อความสไตล์ที่มองเห็นได้บนพื้นหลัง raster ที่ไม่มี glyph), HTMLModeNative (กราฟิกหน้าเป็นชั้น SVG แบบอินไลน์หนึ่งชั้น), หรือ HTMLModeFlow (แบบ HTML ที่ปรับขนาดใหม่พร้อมหัวเรื่องและย่อหน้าในลำดับการอ่าน). หากไม่ตั้งค่า Mode จะให้ค่าเริ่มต้นที่ตรงตามต้นฉบับ: raster หน้าเต็มพร้อมชั้นข้อความที่สามารถเลือกได้และโปร่งแสง.
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) สร้าง Optional Content Group ใหม่และคืนค่า *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 facade ที่เป็นเจ้าของโครงสร้างต้นไม้เชิงตรรกะของเอกสารและตั้งค่า metadata ของแคตาล็อกตามที่ 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 ทำการ serialize ประเภทฟิลด์และค่าทั้งหมดเป็น JSON ({"name": {"type": "text", "value": "Jane"}, ...}); Form.ImportJSON ใช้ payload 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 output ไม่มี glyph ตัวอักษรที่สามารถเลือกได้ | HTMLSaveOptions.Mode ถูกทิ้งไว้เป็นค่าเริ่มต้นที่คงความถูกต้องโดยไม่มีความต้องการชั้นข้อความ | ตั้งค่า Mode: pdf.HTMLModeText สำหรับเลเยอร์ข้อความที่มองเห็นได้และมีสไตล์ |
| HTML export สูญเสียลักษณะฟอนต์ต้นฉบับ | NoFontEmbedding ตั้งค่าเป็น true | ปล่อยให้ NoFontEmbedding false (ค่าเริ่มต้น) เพื่อให้ฟอนต์ที่ฝังอยู่ถูกห่อใหม่เป็น URL ของข้อมูล WOFF @font-face |
Page.TagContent คืนข้อผิดพลาด | ถูกเรียกก่อนที่ Document.TaggedContent() จะเริ่มต้นโครงสร้างต้นไม้ | เรียก Document.TaggedContent() (และตั้งชื่อ/ภาษา) ก่อนการเรียก TagContent ครั้งแรก |
ValidatePDFUA รายงานรูปภาพที่ไม่สอดคล้อง | องค์ประกอบ StructFigure ไม่มีข้อความ alt | เรียก StructElement.SetAlt บนโหนดรูปภาพทุกอัน |
Form.ImportJSON อัปเดตฟิลด์น้อยกว่าที่คาดหวัง | ชื่อฟิลด์ของ payload JSON ไม่ตรงกับชื่อฟิลด์ของแบบฟอร์มเป้าหมาย; การนำเข้าจะยืดหยุ่นและข้ามรายการที่ไม่ตรงกัน | ยืนยันว่าชื่อฟิลด์ที่ส่งออกตรงกับชื่อฟิลด์ของแบบฟอร์มเป้าหมายอย่างแม่นยำ |
FAQ
ฉันควรใช้โหมดการส่งออก HTML แบบใด?
HTMLModeText สำหรับผลลัพธ์ที่เล็กที่สุดและสามารถเลือกได้ทั้งหมด; HTMLModeNative เมื่อความแม่นยำของเวกเตอร์ (เส้นโค้ง, เส้นพื้นฐาน) มีความสำคัญมากกว่าขนาดไฟล์; HTMLModeFlow สำหรับการจัดวางที่ปรับรูปแบบได้และเป็นมิตรกับอุปกรณ์มือถือ. ปล่อยให้ Mode ไม่ตั้งค่าเพื่อใช้ค่าตั้งต้นที่เป็นการแสดงผลแบบ raster พร้อมข้อความโปร่งใสอย่างตรงตามต้นฉบับ.
ฉันสามารถส่งออกเฉพาะบางหน้าไปยัง HTML ได้หรือไม่?
ใช่. ตั้งค่า HTMLSaveOptions.Pages ให้เป็นส่วนของหมายเลขหน้าที่นับจาก 1, เช่น pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.
ฉันจะซ่อนเลเยอร์เป็นค่าเริ่มต้นแต่ให้ผู้ชมสามารถเปิดกลับได้อย่างไร?
เรียก Layer.SetVisible(false) ก่อนบันทึก. เลเยอร์จะคงเป็น Optional Content Group ที่สามารถอ้างอิงได้; Layer.IsVisible() รายงานสถานะปัจจุบันของมัน.
การส่งออกฟอร์ม JSON มีประเภทฟิลด์รวมอยู่หรือไม่?
ใช่. แต่ละฟิลด์ที่ส่งออกเป็นอ็อบเจ็กต์ JSON ที่มีคีย์ type และ value, เช่น {"subscribe": {"type": "checkbox", "value": true}}.
ฉันต้องเรียก TagContent สำหรับแต่ละองค์ประกอบหรือสามารถซ้อนกลุ่มโดยตรงได้?
ทั้งสองอย่าง. Page.TagContent ห่อการเรียกวาดรูปและเพิ่มองค์ประกอบโครงสร้างแบบ leaf. สำหรับการจัดกลุ่มองค์ประกอบ (ตาราง, รายการ) ให้เรียก StructElement.AddChild ที่รากของต้นไม้หรือที่องค์ประกอบพาเรนท์เพื่อสร้างการซ้อนกันก่อน แล้วทำการแท็กเนื้อหา leaf ด้านล่าง.
API Reference สรุป
| Class/Method | คำอธิบาย |
|---|---|
Document.SaveHTML / WriteHTML | ส่งออกเอกสารไปยัง HTML โดยควบคุมโดย HTMLSaveOptions |
HTMLSaveOptions | การกำหนดค่าการส่งออก HTML: โหมด, DPI, ช่วงหน้า, การจัดการทรัพยากร |
Document.AddLayer / Layers | สร้างหรือแสดงรายการ Optional Content Groups ในเอกสาร |
Page.BeginLayer / EndLayer | ทำเครื่องหมายเนื้อหาหน้าว่าเป็นของเลเยอร์ |
Layer | กลุ่มเนื้อหาแบบเลือกได้ — ชื่อและการมองเห็น |
Document.TaggedContent | ส่วนหน้าต่างสำหรับต้นไม้โครงสร้างเชิงตรรกะของเอกสาร (Tagged PDF) |
TaggedContent | ตั้งชื่อเอกสาร/ภาษาและเปิดเผยรากของต้นไม้โครงสร้าง |
Page.TagContent / TagArtifact | การเรียกใช้การวาดวงเล็บในเนื้อหาเครื่องหมายและองค์ประกอบโครงสร้าง |
StructElement | โหนดในต้นไม้โครงสร้างเชิงตรรกะ — children, alt text, language |
Form.ExportJSON / ImportJSON | ทำการซีเรียลไลซ์หรือใช้ข้อมูลฟิลด์ AcroForm เป็น JSON |
JSONExportOptions | การกำหนดค่าการส่งออก JSON: การเยื้อง, omit-empty |