Quản lý tài liệu
Quản lý Tài liệu
Document là điểm vào cho mọi thao tác quản lý tài liệu được đề cập ở đây: mở và lưu tệp, xuất ra HTML, thêm các lớp nội dung tùy chọn, tạo Tagged PDF, và đọc hoặc ghi dữ liệu AcroForm. Page và Form được truy cập thông qua Document.Page(n) và Document.Form().
Mở và Lưu Tài liệu
pdf.Open tải một PDF từ đường dẫn tệp; pdf.OpenWithPassword thực hiện tương tự cho các tệp được bảo vệ bằng mật khẩu. Document.Save ghi kết quả vào một đường dẫn tệp mới.
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")Xuất ra HTML
Document.SaveHTML và Document.WriteHTML chuyển đổi một tài liệu sang HTML. HTMLSaveOptions.Mode chọn cách biểu diễn: HTMLModeText (văn bản có kiểu dáng hiển thị trên nền raster không có glyph), HTMLModeNative (đồ họa trang dưới dạng một lớp SVG nội tuyến), hoặc HTMLModeFlow (HTML có thể tái định dạng với tiêu đề và đoạn văn theo thứ tự đọc). Nếu không đặt Mode, sẽ sử dụng mặc định trung thực: một raster toàn trang với lớp văn bản có thể chọn trong suốt.
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"})Quản lý Các Lớp Nội Dung Tùy Chọn
Document.AddLayer(name) tạo một Nhóm Nội dung Tùy chọn mới và trả về một *Layer; Document.Layers() liệt kê mọi lớp đã có. Page.BeginLayer / Page.EndLayer đánh dấu nội dung trang là thuộc về một lớp, và Layer.SetVisible(false) ẩn nội dung đó.
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")Xây dựng PDF Đánh thẻ (Có thể truy cập)
Document.TaggedContent() trả về mặt nạ *TaggedContent sở hữu cây cấu trúc logic của tài liệu và thiết lập siêu dữ liệu catalog mà PDF/UA yêu cầu. Page.TagContent bao quanh một lời gọi vẽ trong nội dung đã đánh dấu và trả về một *StructElement cho nút đó.
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")Các phần tử nhóm cũng lồng dưới gốc cây:
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 })Xuất và nhập dữ liệu biểu mẫu dưới dạng JSON
Form.ExportJSON tuần tự hóa mọi kiểu trường và giá trị thành JSON ({"name": {"type": "text", "value": "Jane"}, ...}); Form.ImportJSON áp dụng tải trọng JSON vào một biểu mẫu và trả về số lượng trường mà nó đã cập nhật. JSONExportOptions.Indent in ra kết quả một cách đẹp mắt.
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)Mẹo và Thực hành Tốt nhất
- Chọn
HTMLModeNativecho các trang có nhiều vector,HTMLModeFlowcho việc đọc dạng luồng/di động, và mặc định trung thực (không đặtMode) khi độ chính xác hình ảnh là quan trọng nhất. - Gọi
Layer.SetVisible(false)trướcSaveđể ẩn lớp watermark hoặc annotation theo mặc định trong khi vẫn giữ nội dung có thể định địa chỉ thông qua đối tượngLayer. - Đặt
TaggedContent.SetTitlevàSetLanguagetrước khi gọiPage.TagContent, vì việc kiểm tra xác thực PDF/UA kiểm tra siêu dữ liệu cấp danh mục mà các phương thức này ghi. - Gọi
StructElement.SetAlttrên mỗi nútStructFigure— các hình ảnh không có văn bản thay thế sẽ không vượt qua kiểm tra PDF/UA. - Sử dụng
JSONExportOptions.Indentđể so sánh (diff) trạng thái biểu mẫu đã xuất theo cách dễ đọc cho con người; bỏ qua nó cho các tải trọng máy-tới-máy gọn gàng.
Các vấn đề thường gặp
| Vấn đề | Nguyên nhân | Cách khắc phục |
|---|---|---|
| HTML đầu ra không có các glyph văn bản có thể chọn | HTMLSaveOptions.Mode để lại ở mặc định trung thực mà không có yêu cầu lớp văn bản | Đặt Mode: pdf.HTMLModeText cho lớp văn bản có thể nhìn thấy, đã định dạng |
| HTML export mất diện mạo phông chữ nguồn | NoFontEmbedding được đặt thành true | Để NoFontEmbedding false (mặc định) để các phông chữ nhúng được đóng gói lại dưới dạng WOFF @font-face data URLs |
Page.TagContent trả về lỗi | Được gọi trước khi Document.TaggedContent() khởi tạo cây cấu trúc | Gọi Document.TaggedContent() (và đặt tiêu đề/ngôn ngữ) trước lần gọi TagContent đầu tiên |
ValidatePDFUA báo cáo các hình ảnh không tuân thủ | Một phần tử StructFigure không có văn bản thay thế | Gọi StructElement.SetAlt trên mỗi nút hình |
Form.ImportJSON cập nhật ít trường hơn dự kiến | Tên các trường payload của JSON không khớp với tên các trường của biểu mẫu đích; việc nhập khoan dung và bỏ qua các mục không khớp | Xác nhận rằng các tên trường đã xuất khớp hoàn toàn với tên trường của biểu mẫu đích |
FAQ
Tôi nên sử dụng chế độ xuất HTML nào?
HTMLModeText cho đầu ra nhỏ nhất, có thể chọn toàn bộ; HTMLModeNative khi độ trung thực vector (đường cong, nét gốc) quan trọng hơn kích thước tệp; HTMLModeFlow cho bố cục đọc có thể tái luồng, thân thiện với di động. Để Mode không được đặt để giữ mặc định raster-cộng-văn bản-trong-suất trung thực.
Tôi có thể xuất chỉ các trang cụ thể sang HTML không?
Có. Đặt HTMLSaveOptions.Pages thành một dải các số trang tính từ 1, ví dụ pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.
Làm sao để tôi ẩn một lớp theo mặc định nhưng cho phép người xem bật lại?
Gọi Layer.SetVisible(false) trước khi lưu. Lớp vẫn là một Optional Content Group có thể địa chỉ được; Layer.IsVisible() báo cáo trạng thái hiện tại của nó.
Xuất biểu mẫu JSON có bao gồm loại trường không?
Có. Mỗi trường được xuất là một đối tượng JSON với các khóa type và value, ví dụ {"subscribe": {"type": "checkbox", "value": true}}.
Tôi có cần gọi TagContent cho từng phần tử không, hay có thể lồng nhóm trực tiếp?
Cả hai. Page.TagContent bao bọc một lời gọi vẽ và thêm một phần tử cấu trúc lá. Đối với việc nhóm các phần tử (bảng, danh sách), gọi StructElement.AddChild trên gốc cây hoặc một phần tử cha để xây dựng cấu trúc lồng nhau trước, sau đó gắn thẻ nội dung lá bên dưới.
API Reference Tóm tắt
| Lớp/Phương thức | Mô tả |
|---|---|
Document.SaveHTML / WriteHTML | Xuất tài liệu sang HTML, được điều khiển bởi HTMLSaveOptions |
HTMLSaveOptions | Cấu hình xuất HTML: chế độ, DPI, tập con trang, xử lý tài nguyên |
Document.AddLayer / Layers | Tạo hoặc liệt kê Nhóm Nội Dung Tùy Chọn trên tài liệu |
Page.BeginLayer / EndLayer | Đánh dấu nội dung trang là thuộc về một lớp |
Layer | Nhóm Nội dung Tùy chọn — tên và khả năng hiển thị |
Document.TaggedContent | Giao diện cho cây cấu trúc logic của tài liệu (Tagged PDF) |
TaggedContent | Đặt tiêu đề/ngôn ngữ tài liệu và hiển thị gốc cây cấu trúc |
Page.TagContent / TagArtifact | Gọi vẽ dấu ngoặc trong nội dung đã đánh dấu và các phần tử cấu trúc |
StructElement | Một nút trong cây cấu trúc logic — các nút con, văn bản thay thế, ngôn ngữ |
Form.ExportJSON / ImportJSON | Chuỗi hoá hoặc áp dụng dữ liệu trường AcroForm dưới dạng JSON |
JSONExportOptions | Cấu hình xuất JSON: thụt lề, bỏ trống |