Quản lý tài liệu

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 HTMLModeNative cho các trang có nhiều vector, HTMLModeFlow cho việc đọc dạng luồng/di động, và mặc định trung thực (không đặt Mode) khi độ chính xác hình ảnh là quan trọng nhất.
  • Gọi Layer.SetVisible(false) trước Save để ẩ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ượng Layer.
  • Đặt TaggedContent.SetTitle và SetLanguage trước khi gọi Page.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.SetAlt trên mỗi nút StructFigure — 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ânCách khắc phục
HTML đầu ra không có các glyph văn bản có thể chọnHTMLSaveOptions.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ồnNoFontEmbedding đượ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úcGọ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ếnTê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ớpXá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ứcMô tả
Document.SaveHTML / WriteHTMLXuất tài liệu sang HTML, được điều khiển bởi HTMLSaveOptions
HTMLSaveOptionsCấu hình xuất HTML: chế độ, DPI, tập con trang, xử lý tài nguyên
Document.AddLayer / LayersTạ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
LayerNhóm Nội dung Tùy chọn — tên và khả năng hiển thị
Document.TaggedContentGiao 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 / TagArtifactGọi vẽ dấu ngoặc trong nội dung đã đánh dấu và các phần tử cấu trúc
StructElementMộ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 / ImportJSONChuỗi hoá hoặc áp dụng dữ liệu trường AcroForm dưới dạng JSON
JSONExportOptionsCấu hình xuất JSON: thụt lề, bỏ trống

Xem thêm

 Tiếng Việt