常见问题

常见问题

许可与开源

Aspose.PDF FOSS for Go 的许可证是什么?

Aspose.PDF FOSS for Go 在以下许可下发布 MIT 许可证. 完整的许可证文本已包含在仓库中的 github.com/aspose-pdf-foss/aspose-pdf-foss-for-go. 不需要注册、激活文件或运行时密钥。

我可以在商业产品中使用 Aspose.PDF FOSS for Go 吗?

是的。MIT 许可证允许无限制的商业使用、修改、分发和私有使用。您必须在软件的所有副本或重要部分中包含版权声明和 MIT 许可证文本。

有企业版吗?

Aspose.PDF FOSS 是开源的、MIT 许可证版本。另有一款单独的商业 Aspose.PDF 产品可作为 Aspose.PDF — Enterprise Product Family 提供企业级支持、扩展的格式覆盖以及云集成。


安装和需求

我该如何安装 Aspose.PDF FOSS for Go?

将模块添加到您的 Go 项目中:

go get github.com/aspose-pdf-foss/aspose-pdf-foss-for-go

在源文件中使用别名导入它:

import pdf "github.com/aspose-pdf-foss/aspose-pdf-foss-for-go"

需要哪个 Go 版本?

需要 Go 1.24 或更高版本。使用 go version 验证您的版本。

是否存在本地或系统库依赖?

No. Aspose.PDF FOSS for Go 是纯 Go 实现,没有 C、C++ 或 CGo 依赖。它不需要任何系统库、PDF 查看器或外部工具。


API Usage

我该如何打开已有的 PDF?

对标准 PDF 使用 pdf.Open,对受密码保护的文件使用 pdf.OpenWithPassword:

doc, err := pdf.Open("document.pdf")
if err != nil {
    panic(err)
}
fmt.Println(doc.PageCount())

我该如何将 PDF 拆分为单独的页?

Document.Split 返回一个 []*Document,每页一个:

doc, _ := pdf.Open("report.pdf")
pages, _ := doc.Split()
for i, p := range pages {
    p.Save(fmt.Sprintf("page_%03d.pdf", i+1))
}

我该如何合并多个 PDF?

Document.Append 在原位合并源文档:

base, _ := pdf.Open("part1.pdf")
part2, _ := pdf.Open("part2.pdf")
base.Append(part2)
base.Save("combined.pdf")

我该如何填写 AcroForm 字段?

使用 Document.Form().Field(name) 并断言具体类型:

doc, _ := pdf.Open("form.pdf")
text := doc.Form().Field("customer_name").(*pdf.TextBoxField)
text.SetValue("Jane Doe")

check := doc.Form().Field("agree").(*pdf.CheckboxField)
check.SetChecked(true)

doc.Save("form_filled.pdf")

支持的字段类型: TextBoxField, CheckboxField, RadioButtonField, ComboBoxField, ListBoxField, ButtonField.

我该如何添加书签?

创建一个 OutlineItemCollection 并设置一个 Destination:

doc, _ := pdf.Open("manual.pdf")
page, _ := doc.Page(1)

bm := pdf.NewOutlineItemCollection(doc)
bm.SetTitle("Chapter 1")
bm.SetDestination(pdf.NewDestinationXYZ(page, 0, 800, 1.0))
doc.Outlines().Add(bm)
doc.Save("manual_with_bookmarks.pdf")

安全性与加密

我该如何为 PDF 设置密码保护?

使用 Document.SetEncryption 与 EncryptionOptions 结构体来应用密码保护和权限标志。提供用于打开文件的用户密码以及用于修改权限的所有者密码:

doc, _ := pdf.Open("doc.pdf")
doc.SetEncryption(pdf.EncryptionOptions{
    UserPassword:  "userpass",
    OwnerPassword: "ownerpass",
    Permissions:   &pdf.Permissions{AllowPrint: true, AllowCopy: false},
})
doc.Save("doc_protected.pdf")

支持哪些加密算法?

通过 EncryptionOptions.Algorithm 提供三种算法:

AlgorithmConstantStandard
AES-128EncryptionAlgAES128(默认)ISO 32000-1
AES-256EncryptionAlgAES256ISO 32000-2(PDF 2.0 输出)
RC4-128EncryptionAlgRC4_128Legacy

如何打开受密码保护的文件?

当文件需要身份验证时使用 pdf.OpenWithPassword。将用户密码作为第二个参数传入;解密成功后它会返回一个普通的 *Document:

doc, err := pdf.OpenWithPassword("protected.pdf", "userpass")
if err != nil {
    panic(err)
}
fmt.Println(doc.PageCount())

如何去除 PDF 的加密?

在使用正确密码打开文件后调用 Document.RemoveEncryption。保存结果即可写出未加密的副本:

doc, _ := pdf.OpenWithPassword("protected.pdf", "userpass")
doc.RemoveEncryption()
doc.Save("decrypted.pdf")

渲染与文本

如何将 PDF 页面渲染为图像?

使用以下设备类型之一:BmpDevice、PngDevice、JpegDevice、TiffDevice或GifDevice。使用Resolution值构造设备,并使用io.Writer和RenderOptions调用相应的Render*方法:

doc, _ := pdf.Open("report.pdf")
page, _ := doc.Page(1)
f, _ := os.Create("page1.png")
defer f.Close()
page.RenderPNG(f, pdf.RenderOptions{DPI: 150})

我该如何在 PDF 中搜索文本?

使用查询字符串和SearchOptions调用 Document.SearchText。结果是一个 TextMatch 值的切片——每个元素包含匹配的文本、其页码索引以及其边界框。

doc, _ := pdf.Open("doc.pdf")
matches, _ := doc.SearchText("total", pdf.SearchOptions{CaseInsensitive: true})
for _, m := range matches {
    fmt.Printf("page %d: %q\n", m.PageNumber, m.Text)
}

如何将表单扁平化?

在填写或审阅表单后调用 Document.Flatten。该方法将所有字段值烘焙到页面图形中,并删除交互式表单字段:

doc, _ := pdf.Open("filled.pdf")
doc.Flatten()
doc.Save("flat.pdf")

已知限制

是否支持所有 PDF 功能?

该库涵盖了最常见的文档管理操作:打开、创建、保存、拆分、合并、页面提取、加密、AcroForms、表格、书签、注释、渲染为图像、文本搜索以及表单扁平化。数字签名、3D 内容和 PDF/A 转换等高级功能在当前版本中可能尚未完全实现。请查阅仓库的 README 以获取当前功能状态。

如果我使用与字段类型不匹配的类型断言,会发生什么?

对 Field 进行的类型断言如果与实际字段类型不匹配,将触发 panic。请使用 pdf.FieldType(f) 在断言前检查类型,或使用类型 switch:

doc, _ := pdf.Open("form.pdf")
for _, f := range doc.Form().Fields() {
    switch v := f.(type) {
    case *pdf.TextBoxField:
        fmt.Println("text:", v.Value())
    case *pdf.CheckboxField:
        fmt.Println("checked:", v.Checked())
    }
}

另请参阅

 中文