简介

在本文中,您将学习如何使用 Aspose.PDF FOSS 在 Go 中执行核心 PDF 文档管理操作:打开和保存文档、创建新 PDF、将文档拆分为每页文件、合并多个 PDF、提取页面范围,以及读取或写入文档元数据。所有操作均不需要任何原生 C 或 C++ 依赖。

该库是位于 github.com/aspose-pdf-foss/aspose-pdf-foss-for-go 的 Go 模块,采用 MIT 许可证,并且需要 Go 1.24 或更高版本。

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

本文涵盖形成核心文档管理界面的 DocumentPagePageRangeDocumentInfo 类型。


核心操作

打开和保存文档

pdf.Open 从磁盘加载 PDF 并返回一个 *DocumentOpenWithPassword 对受密码保护的文件执行相同操作。Document.Save 将结果写回文件路径。Document.WriteTo 将其写入 io.Writer,用于内存或网络场景。

// Open a standard PDF
doc, err := pdf.Open("input.pdf")
if err != nil {
	panic(err)
}

// Open an encrypted PDF
protected, err := pdf.OpenWithPassword("locked.pdf", "userpassword")
if err != nil {
	panic(err)
}

// Save to a new path
err = doc.Save("output.pdf")
fmt.Println(protected.PageCount())

创建新文档

pdf.NewDocument 创建一个空的 *Document。使用 AddBlankPageFromFormat 添加一页标准纸张尺寸的空白页。PageFormat 提供命名的格式常量(PageFormatA4PageFormatLetter 等)。

doc := pdf.NewDocumentFromFormat(pdf.PageFormatA4)

doc.Save("new_document.pdf")

拆分文档

Document.Split 将 PDF 拆分为单独的每页 *Document 值。每个返回的文档恰好包含一页,并且可以独立保存。这对于拆分批量生成的报告或分离发票页面非常有用。

doc, _ := pdf.Open("multi_page.pdf")
pages, err := doc.Split()
if err != nil {
	panic(err)
}

for i, p := range pages {
	filename := fmt.Sprintf("page_%03d.pdf", i+1)
	if err := p.Save(filename); err != nil {
		fmt.Printf("Failed to save page %d: %v\n", i+1, err)
	}
}
fmt.Printf("Split into %d pages\n", len(pages))

合并多个 PDF

Document.Append 将第二个 *Document 合并到接收器中,原位追加来源的所有页面。重复调用 Append 可在单个 Save 之前串联多个文档。源文档不会被修改。

base, _ := pdf.Open("report_intro.pdf")
section1, _ := pdf.Open("section1.pdf")
section2, _ := pdf.Open("section2.pdf")
appendix, _ := pdf.Open("appendix.pdf")

base.Append(section1)
base.Append(section2)
base.Append(appendix)

base.Save("complete_report.pdf")

提取页面范围

PageRange 表示一个包含的范围(基于 1,使用 From/To 字段)。将范围传递给 Document.Extract 以生成一个仅包含所选页面的新 *Document。这对于构建每章节导出或省略特定页面的编辑副本非常有用。

doc, _ := pdf.Open("long_report.pdf")

// Extract pages 3 through 7
subset, err := doc.Extract(pdf.PageRange{From: 3, To: 7})
if err != nil {
	panic(err)
}
subset.Save("pages_3_to_7.pdf")

读取和写入文档元数据

Document.Info 返回一个 DocumentInfo 结构体,公开 Info 字典字段:TitleAuthorSubjectKeywordsCreatorProducerCreationDateModDate。直接修改这些字段,然后在调用 Save 之前调用 Document.SetInfo 将更新后的结构体写回。

doc, _ := pdf.Open("report.pdf")
info, _ := doc.Info()

// Read current values
fmt.Printf("Title: %s\nAuthor: %s\n", info.Title, info.Author)

// Update fields
info.Title = "Annual Report 2026"
info.Author = "Finance Team"
info.Keywords = "annual, report, finance, 2026"

doc.SetInfo(info)
doc.Save("report_updated.pdf")

访问单个页面

Document.Page(n) 通过基于 1 的索引检索一个 *PageDocument.PageCount 返回页面的总数。页面公开几何属性,以读取页面框和尺寸。

doc, _ := pdf.Open("document.pdf")
fmt.Printf("Page count: %d\n", doc.PageCount())

page, _ := doc.Page(1)
size, err := page.Size()
if err != nil {
	panic(err)
}
fmt.Printf("Page 1 size: %.0f x %.0f pt\n", size.Width, size.Height)

快速入门

使用 go get 安装模块,然后运行下面的完整示例。示例打开一个源文档,将其前三页提取到一个新文档,更新 DocumentInfo 元数据字段,并将结果保存到磁盘。

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

一个完整的示例,打开文档,提取第1–3页,并使用更新的元数据保存结果:

package main

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

func main() {
	// Open source document
	src, err := pdf.Open("source.pdf")
	if err != nil {
		panic(err)
	}

	// Extract pages 1-3
	subset, err := src.Extract(pdf.PageRange{From: 1, To: 3})
	if err != nil {
		panic(err)
	}

	// Update metadata
	info, _ := subset.Info()
	info.Title = "Pages 1-3 Extract"
	info.Author = "Document Pipeline"
	subset.SetInfo(info)

	if err := subset.Save("extract_pages_1_3.pdf"); err != nil {
		panic(err)
	}
	fmt.Printf("Saved %d pages\n", subset.PageCount())
}

开源与许可

Aspose.PDF FOSS for Go 在 MIT 许可证下发布。没有使用限制、运行时费用,也无需注册。源代码可在 github.com/aspose-pdf-foss/aspose-pdf-foss-for-go 获取。


快速入门

相关资源