如何在 .NET 中使用核心文档管理
Aspose.PDF FOSS for .NET 提供 Document 类作为所有 PDF 操作的中心入口点。使用 dotnet add package Aspose.Pdf.Foss --version 0.1.0-alpha 安装该包,并使用 Document.Create()、Document.Open()、Document.Save() 和 Document.Merge() 在 .NET 8+ 上以编程方式管理 PDF 文档。
分步指南
步骤 1:安装软件包
将 Aspose.PDF FOSS 添加到您的项目中:
dotnet add package Aspose.Pdf.Foss --version 0.1.0-alpha验证您在 .csproj 中的引用:
<PackageReference Include="Aspose.Pdf.Foss" Version="0.1.0-alpha" />步骤 2:导入所需类
在文件顶部添加必要的 using 指令:
using Aspose.Pdf;
using Aspose.Pdf.Annotations;步骤 3:创建新 PDF 文档
使用 Document.Create() 生成一个空的内存文档:
using var doc = Document.Create();
// The document has no pages yet; add pages before saving
using var ms = new MemoryStream();
doc.Save(ms);
byte[] pdfBytes = ms.ToArray();步骤 4:打开现有 PDF
Document.Open 接受字节数组、文件路径或流。使用 using 确保文档在使用后被释放:
// From a file path
using var doc = Document.Open("input.pdf");
var page = doc.Pages[1];
// From a byte array loaded elsewhere
byte[] data = File.ReadAllBytes("input.pdf");
using var doc2 = Document.Open(data);步骤 5:访问页面
Document.Pages 属性返回一个 PageCollection。页面采用 1 索引:
using var doc = Document.Open("input.pdf");
int pageCount = doc.Pages.Count;
var firstPage = doc.Pages[1];
double width = firstPage.Width;
double height = firstPage.Height;步骤 6:保存文档
使用 Document.Save() 将其保存到流,或使用 Document.ToArray() 将其序列化为字节数组:
using var doc = Document.Open("input.pdf");
var page = doc.Pages[1];
var action = PdfAction.CreateUri("https://aspose.com/test");
page.Annotations.AddLinkAnnotation(new Rectangle(50, 700, 200, 720), action);
using var ms = new MemoryStream();
doc.Save(ms);
ms.Position = 0;
byte[] savedBytes = ms.ToArray();第7步:合并多个文档
使用 Document.Merge() 将多个 Document 实例合并为一个:
using var doc1 = Document.Open("part1.pdf");
using var doc2 = Document.Open("part2.pdf");
var merged = Document.Merge(new[] { doc1, doc2 });
merged.Save("combined.pdf");Document.MergeDocuments() 是一个等效的重载,直接接受文件路径数组。
常见问题及解决方案
Document.Create() 后页面集合为空Document.Create() 返回一个没有页面的文档。必须在访问 doc.Pages[1] 之前显式添加页面。尝试访问不存在的索引会抛出 IndexOutOfRangeException。
在损坏的文件上调用 Document.Open 时的 InvalidOperationException
如果 PDF 字节数组或文件被截断或无效,Document.Open 将抛出异常。在将其传递给 Open 之前,请验证源字节数组是完整的 PDF(以 %PDF- 开头)。
文档未释放 — 高吞吐场景下的内存泄漏
始终在 using 语句中包装 Document.Open 和 Document.Create 调用。Document 类实现了 IDisposable;未能释放它会导致底层流和交叉引用表仍驻留在内存中。
在 ms.Position 未重置后调用 Save(ms)
在 doc.Save(ms) 之后从 MemoryStream 读取时,读取前请先重置 ms.Position = 0。省略此步骤会导致读取器遇到空的或部分的 PDF。
合并产生的文档页数异常
确保在将所有源文档传递给 Document.Merge 之前,它们已完全加载。 在合并调用之前释放源文档可能导致页面树不完整。
常见问题
我可以打开受密码保护的 PDF 吗?
是的。使用 Document.Open(data, password) 或 Document.Open(path, password) 将所有者或用户密码作为第二个参数提供。
Document.ToArray() 与保存到 MemoryStream 有何不同?
Document.ToArray() 是一个便利方法,内部保存到 MemoryStream 并返回生成的字节数组。两条路径产生相同的 PDF 输出。
Pages 属性的类型是什么?
Document.Pages 是 PageCollection 类型。它是从 1 开始索引的;doc.Pages[1] 是第一页。
我可以多次保存文档吗?
是的。您可以在同一个文档实例上多次调用 doc.Save() 或 doc.ToArray()。每次调用都会序列化文档的当前状态。
如何检查文档是否已获得许可?
Document.IsLicensed 返回一个 bool,指示内部许可状态。对于 Aspose.PDF FOSS,这仅用于信息提示 — 无需激活。