Manajemen Dokumen
Manajemen Dokumen
Document adalah titik masuk untuk setiap operasi manajemen dokumen yang dibahas di sini: membuka dan menyimpan file, mengekspor ke HTML, menambahkan lapisan konten opsional, membuat Tagged PDF, dan membaca atau menulis data AcroForm. Page dan Form dapat diakses melalui Document.Page(n) dan Document.Form().
Membuka dan Menyimpan Dokumen
pdf.Open memuat PDF dari jalur file; pdf.OpenWithPassword melakukan hal yang sama untuk file yang dilindungi kata sandi. Document.Save menulis hasilnya ke jalur file baru.
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")Mengekspor ke HTML
Document.SaveHTML dan Document.WriteHTML mengonversi dokumen menjadi HTML. HTMLSaveOptions.Mode memilih representasi: HTMLModeText (teks bergaya yang terlihat di atas latar raster tanpa glif), HTMLModeNative (grafik halaman sebagai satu lapisan SVG inline), atau HTMLModeFlow (reflowable HTML dengan judul dan paragraf dalam urutan bacaan). Membiarkan Mode tidak disetel menghasilkan nilai bawaan yang setia: raster halaman penuh dengan lapisan teks yang dapat dipilih dan transparan.
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"})Mengelola Lapisan Konten Opsional
Document.AddLayer(name) membuat Optional Content Group baru dan mengembalikan *Layer; Document.Layers() menampilkan setiap lapisan yang sudah ada. Page.BeginLayer / Page.EndLayer menandai konten halaman sebagai milik suatu lapisan, dan Layer.SetVisible(false) menyembunyikan konten tersebut.
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")Membangun PDF Berlabel (Aksesibel)
Document.TaggedContent() mengembalikan facade *TaggedContent yang memiliki pohon struktur logis dokumen dan mengatur metadata katalog yang diperlukan oleh PDF/UA. Page.TagContent menempatkan panggilan gambar dalam konten bertanda dan mengembalikan *StructElement untuk node tersebut.
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")Pengelompokan elemen juga menumpuk di bawah akar pohon:
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 })Mengekspor dan Mengimpor Data Formulir sebagai JSON
Form.ExportJSON menserialisasi setiap tipe bidang dan nilai ke JSON ({"name": {"type": "text", "value": "Jane"}, ...}); Form.ImportJSON menerapkan muatan JSON ke sebuah formulir dan mengembalikan jumlah bidang yang diperbarui. JSONExportOptions.Indent mencetak output dengan format yang rapi.
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)Tips dan Praktik Terbaik
- Pilih
HTMLModeNativeuntuk halaman yang banyak vektor,HTMLModeFlowuntuk pembacaan reflow/mobile, dan default yang setia (tanpaModeyang diatur) ketika keakuratan visual paling penting. - Panggil
Layer.SetVisible(false)sebelumSaveuntuk menyembunyikan lapisan watermark atau anotasi secara default sambil menjaga konten dapat diakses melalui objekLayer. - Atur
TaggedContent.SetTitledanSetLanguagesebelum memanggilPage.TagContent, karena validasi PDF/UA memeriksa metadata tingkat katalog yang ditulis oleh metode tersebut. - Panggil
StructElement.SetAltpada setiap nodeStructFigure— gambar tanpa teks alternatif gagal validasi PDF/UA. - Gunakan
JSONExportOptions.Indentuntuk perbandingan yang dapat dibaca manusia dari status formulir yang diekspor; hilangkan untuk payload mesin-ke-mesin yang kompak.
Masalah Umum
| Masalah | Penyebab | Perbaikan |
|---|---|---|
| HTML output tidak memiliki glif teks yang dapat dipilih | HTMLSaveOptions.Mode dibiarkan pada default yang setia tanpa persyaratan lapisan teks | Setel Mode: pdf.HTMLModeText untuk lapisan teks yang terlihat dan bergaya |
| HTML export kehilangan tampilan font sumber | NoFontEmbedding diatur ke true | Biarkan NoFontEmbedding false (default) sehingga font yang disematkan dibungkus ulang sebagai data URL WOFF @font-face |
Page.TagContent mengembalikan error | Dipanggil sebelum Document.TaggedContent() menginisialisasi pohon struktur | Panggil Document.TaggedContent() (dan atur judul/bahasa) sebelum pemanggilan TagContent pertama |
ValidatePDFUA melaporkan figur yang tidak sesuai | Elemen StructFigure tidak memiliki teks alt | Panggil StructElement.SetAlt pada setiap node figur |
Form.ImportJSON memperbarui lebih sedikit bidang daripada yang diharapkan | Nama bidang payload JSON tidak cocok dengan nama bidang formulir target; impor bersifat toleran dan melewati entri yang tidak cocok | Pastikan nama bidang yang diekspor sama persis dengan nama bidang formulir target |
FAQ
Mode ekspor HTML mana yang harus saya gunakan?
HTMLModeText untuk output terkecil, sepenuhnya dapat dipilih; HTMLModeNative ketika kesetiaan vektor (kurva, goresan asli) lebih penting daripada ukuran file; HTMLModeFlow untuk tata letak bacaan yang dapat mengalir ulang dan ramah seluler. Biarkan Mode tidak diatur untuk default raster-plus-teks-transparan yang setia.
Apakah saya dapat mengekspor hanya halaman tertentu ke HTML?
Ya. Atur HTMLSaveOptions.Pages menjadi irisan nomor halaman berbasis-1, misalnya pdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []intpdf.HTMLSaveOptions{Pages: []int{1, 3}}}}.
Bagaimana cara menyembunyikan lapisan secara default tetapi membiarkan penampil mengaktifkannya kembali?
Panggil Layer.SetVisible(false) sebelum menyimpan. Lapisan tetap menjadi Optional Content Group yang dapat diakses; Layer.IsVisible() melaporkan keadaan saat ini.
Apakah ekspor formulir JSON mencakup tipe bidang?
Ya. Setiap bidang yang diekspor adalah objek JSON dengan kunci type dan value, misalnya {"subscribe": {"type": "checkbox", "value": true}}.
Apakah saya harus memanggil TagContent untuk setiap elemen, atau dapat menyusun grup secara langsung?
Keduanya. Page.TagContent membungkus panggilan menggambar dan menambahkan elemen struktur daun. Untuk mengelompokkan elemen (tabel, daftar), panggil StructElement.AddChild pada akar pohon atau elemen induk untuk membangun penumpukan terlebih dahulu, kemudian beri tag pada konten daun di bawahnya.
API Reference Ringkasan
| Kelas/Metode | Deskripsi |
|---|---|
Document.SaveHTML / WriteHTML | Ekspor dokumen ke HTML, dikendalikan oleh HTMLSaveOptions |
HTMLSaveOptions | HTML konfigurasi ekspor: mode, DPI, subset halaman, penanganan sumber daya |
Document.AddLayer / Layers | Buat atau daftar Optional Content Groups pada dokumen |
Page.BeginLayer / EndLayer | Tandai konten halaman sebagai milik lapisan |
Layer | Optional Content Group — nama dan visibilitas |
Document.TaggedContent | Fasade untuk pohon struktur logis dokumen (Tagged PDF) |
TaggedContent | Menetapkan judul/bahasa dokumen dan mengekspos akar pohon struktur |
Page.TagContent / TagArtifact | Membungkus panggilan menggambar dalam konten yang ditandai dan elemen struktur |
StructElement | Sebuah node dalam pohon struktur logis — anak, teks alternatif, bahasa |
Form.ExportJSON / ImportJSON | Serialisasi atau terapkan data bidang AcroForm sebagai JSON |
JSONExportOptions | konfigurasi ekspor JSON: indentasi, omit-empty |