การจัดการเอกสาร

การจัดการเอกสาร

การจัดการเอกสาร

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

ดูเพิ่มเติม

 ภาษาไทย