常见的 Aspose.PDF FOSS for Go 用例
Aspose.PDF FOSS for Go 是一个纯 Go 的 PDF 文档管理模块。本文涵盖了使用 Document、Form、EncryptionOptions、Table 和 OutlineItemCollection 类型时最常需要的操作。
go get github.com/aspose-pdf-foss/aspose-pdf-foss-for-go分步指南
步骤 1:安装包
添加 Go 模块依赖:
go get github.com/aspose-pdf-foss/aspose-pdf-foss-for-go步骤 2:导入包
使用别名以保持导入引用简洁:
import (
"fmt"
pdf "github.com/aspose-pdf-foss/aspose-pdf-foss-for-go"
)步骤 3:将 PDF 拆分为每页文件
Document.Split 将多页文档拆分为每页一个 *Document。
doc, err := pdf.Open("report.pdf")
if err != nil {
panic(err)
}
pages, _ := doc.Split()
for i, p := range pages {
p.Save(fmt.Sprintf("report_page_%03d.pdf", i+1))
}
fmt.Printf("Split %d pages\n", len(pages))步骤 4:合并多个 PDF 为一个
Document.Append 在保存前将第二个文档的页面就地合并。
base, _ := pdf.Open("intro.pdf")
chapter1, _ := pdf.Open("chapter1.pdf")
chapter2, _ := pdf.Open("chapter2.pdf")
appendix, _ := pdf.Open("appendix.pdf")
base.Append(chapter1)
base.Append(chapter2)
base.Append(appendix)
base.Save("full_document.pdf")步骤 5:应用密码加密
EncryptionOptions 在一次调用中配置用户密码、所有者密码、算法以及每个操作的 Permissions:
doc, _ := pdf.Open("contract.pdf")
doc.SetEncryption(pdf.EncryptionOptions{
UserPassword: "clientpass",
OwnerPassword: "adminpass",
Permissions: &pdf.Permissions{AllowPrint: true, AllowCopy: false},
})
doc.Save("contract_protected.pdf")从加密文件生成纯文本副本:
doc, _ := pdf.OpenWithPassword("contract_protected.pdf", "clientpass")
doc.RemoveEncryption()
doc.Save("contract_decrypted.pdf")步骤 6:填写一个 AcroForm
按名称迭代或定位字段。断言具体类型(TextBoxField、CheckboxField、RadioButtonField、ComboBoxField、ListBoxField)。
doc, _ := pdf.Open("application_form.pdf")
name := doc.Form().Field("applicant_name").(*pdf.TextBoxField)
name.SetValue("Jane Doe")
agree := doc.Form().Field("terms_accepted").(*pdf.CheckboxField)
agree.SetChecked(true)
country := doc.Form().Field("country").(*pdf.ComboBoxField)
country.SetSelected(0)
doc.Save("application_filled.pdf")步骤 7:构建表格布局
向页面添加一个 Table,其中包含 Row 和 Cell 条目,用于发票或报告生成:
doc, _ := pdf.Open("invoice_template.pdf")
page, _ := doc.Page(1)
tbl := pdf.NewTable()
tbl.SetColumnWidths([]float64{200, 80, 100})
header := tbl.AddRow()
header.AddCell("Description")
header.AddCell("Qty")
header.AddCell("Amount")
row := tbl.AddRow()
row.AddCell("PDF Processing Service")
row.AddCell("1")
row.AddCell("$500.00")
page.AddTable(tbl, pdf.Rectangle{LLX: 72, LLY: 100, URX: 540, URY: 700})
doc.Save("invoice.pdf")步骤 8:添加书签树
OutlineItemCollection 创建带有章节/节层级的书签,并使用 DestinationXYZ 页面目标:
doc, _ := pdf.Open("manual.pdf")
page1, _ := doc.Page(1)
page2, _ := doc.Page(2)
ch1 := pdf.NewOutlineItemCollection(doc)
ch1.SetTitle("Introduction")
ch1.SetBold(true)
ch1.SetDestination(pdf.NewDestinationXYZ(page1, 0, 792, 1.0))
doc.Outlines().Add(ch1)
ch2 := pdf.NewOutlineItemCollection(doc)
ch2.SetTitle("Configuration")
ch2.SetDestination(pdf.NewDestinationFit(page2))
doc.Outlines().Add(ch2)
doc.Save("manual_bookmarked.pdf")常见问题与解决方案
pdf.Open 对有效的 PDF 文件返回错误 请检查文件路径是否正确,以及文件是否未在其他进程中打开。在 Windows 上,文件锁定可能会阻止读取。
访问表单字段时类型断言导致 panic 使用 pdf.FieldType(f) 或使用 type switch 在断言之前检查字段类型。一个 *pdf.TextBoxField 对 a CheckboxField 将导致 panic。
go get 失败,错误信息为 “module not found” Ensure GOPROXY 已设置为可访问的代理(例如. GOPROXY=direct)并且您的网络能够访问 github.com。在空气隔离的环境中,使用 GONOSUMCHECK 或本地模块镜像。
SaveTo 之后失败 OpenWithPassword 如果您调用 Save after OpenWithPassword 但未调用 RemoveEncryption,输出将使用原始密码重新加密。这是预期的行为——请调用 RemoveEncryption 明确地生成纯文本副本。
合并文档的页数不正确 Append 在原地修改接收者。请确保您没有调用 Append 在已经保存的文档上;如果需要生成多个合并输出,请重新打开原始文档。
常见问答
我可以在不写入磁盘的情况下处理 PDF 吗?
Document.WriteTo 接受一个 io.Writer,因此您可以写入缓冲区、网络流或响应写入器,而无需创建临时文件。
在 Go 中并发使用 Aspose.PDF FOSS 是否安全?
每个 *Document 实例并非 goroutine 安全。每个 goroutine 使用一个 Document,或使用互斥锁保护共享实例。
我该如何读取已填写表单中的字段值?
在任何字段上使用 Field.Value(),或进行类型断言以访问特定类型的访问器,例如 CheckboxField.Checked() 或 ComboBoxField.SelectedIndex()。
我可以在没有现有模板的情况下从头创建 PDF 吗?
是的。pdf.NewDocument() 会创建一个空文档。调用 AddBlankPageFromFormat(pdf.PageFormatA4) 添加空白页,然后在保存之前加入内容(表格、注释等)。
Document.Save 与 Document.WriteTo 有何区别?
Save(path string) 写入文件路径。WriteTo(w io.Writer) 写入任意 io.Writer —— 对于 HTTP 响应、缓冲区或流管道非常有用。