平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“基于C#代码实现方法创建PDF作品集(文件包)”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
落到代码里,PDF 文件包(PDF Portfolio)是一种用来集合多个文件的 PDF 容器,能够包含文本文件、电子表格、电子邮件、图片、PowerPoint 演示文稿以及绘图文件等多种类型的内容。
结合项目来看,虽然 PDF 文件包会将不同格式的文件整合到一个 PDF 中,但其中每个文件仍然保留原始的格式、分辨率和尺寸。下面会介绍如何借助编程方式采用 C# 和 VB.NET 新建 PDF 文件包,同时向其中添加文件或文件夹。
准备开发环境
实际处理时,在开始之前,需在 .NET 项目中添加用来 PDF 处理的相关程序集引用。能够借助下载对应的 DLL 文件,或采用 NuGet 包管理器将相关程序集添加到项目中。
PM> Install-Package Spire.PDF
新建 PDF 文件包并添加文件
理解这一步时,由于 PDF 文件包本质上是多个文件的集合,能够借助 PDF 文档对象提供的集合功能新建文件包,并采用添加文件的方法将所需文件嵌入其中。具体步骤如下所示:
- 指定需添加到 PDF 文件包中的文件。
- 新建
PdfDocument实例。 - 借助
PdfDocument.Collection.AddFile()方法新建 PDF 文件包同时添加文件。 - 采用
PdfDocument.SaveToFile()方法保存生成的 PDF 文件。
完整示例如下所示:
using System;
using Spire.Pdf;
namespace CreatePDFPortfolio
{
class Program
{
static void Main(string[] args)
{
// 指定需要添加的文件
String[] files = new String[] { "input.pdf", "sample.docx", "report.xlsx", "Intro.pptx", "logo.png" };
// 创建 PdfDocument 实例
using (PdfDocument pdf = new PdfDocument())
{
// 创建 PDF 文件包并添加文件
for (int i = 0; i < files.Length; i++)
{
pdf.Collection.AddFile(files[i]);
}
// 保存生成的文件
pdf.SaveToFile("PortfolioWithFiles.pdf", FileFormat.PDF);
pdf.Dispose();
}
}
}
}
新建 PDF 文件包并添加文件夹
落到代码里,在新建 PDF 文件包后,还能够在其中新建文件夹,以便进一步管理和组织包含的文件。具体步骤如下所示:
- 指定需添加到 PDF 文件包中的文件。
- 新建
PdfDocument实例。 - 采用
PdfDocument.Collection新建 PDF 文件包。 - 借助
PdfCollection.Folders.CreateSubfolder()方法在 PDF 文件包中新建文件夹,随后采用PdfFolder.AddFile()方法将文件添加到对应文件夹中。 - 采用
PdfDocument.SaveToFile()方法保存生成的文件。
完整示例如下所示:
using System;
using Spire.Pdf;
using Spire.Pdf.Collections;
namespace CreatePDFPortfolio
{
class Program
{
static void Main(string[] args)
{
// 指定需要添加的文件
String[] files = new String[] { "input.pdf", "sample.docx", "report.xlsx", "Intro.pptx", "logo.png" };
// 创建 PdfDocument 实例
using (PdfDocument pdf = new PdfDocument())
{
// 创建 PDF 文件包并添加文件夹
for (int i = 0; i < files.Length; i++)
{
PdfFolder folder = pdf.Collection.Folders.CreateSubfolder("Folder" + i);
// 将文件添加到文件夹中
folder.AddFile(files[i]);
}
// 保存生成的文件
pdf.SaveToFile("PortfolioWithFolders.pdf", FileFormat.PDF);
pdf.Dispose();
}
}
}
}
知识扩展
在这个场景下,PDF 作品集(PDF Portfolio)是一种特殊的 PDF 文档,它能够将多个不同类型的文件——如 PDF、Word、Excel、图片等——打包到一个 PDF 容器中,同时保留每个文件的原始格式。
以下是几种主流的 C# 实现方案。
方案一:Spire.PDF(建议,API 最简洁)
Spire.PDF 借助 PdfDocument.Collection 属性提供最直观的 API,几行代码即可完成作品集新建。
安装:
Install-Package Spire.PDF
基础用法——添加多个文件:
using Spire.Pdf;
class Program
{
static void Main()
{
// 指定要打包的文件
string[] files = new string[]
{
"document.pdf",
"report.docx",
"data.xlsx",
"presentation.pptx",
"logo.png"
};
using (PdfDocument pdf = new PdfDocument())
{
// 创建 PDF 作品集并添加文件
for (int i = 0; i < files.Length; i++)
{
pdf.Collection.AddFile(files[i]);
}
// 保存作品集
pdf.SaveToFile("PortfolioWithFiles.pdf", FileFormat.PDF);
}
}
}
进阶用法——在作品集内新建文件夹结构:
using Spire.Pdf;
using Spire.Pdf.Collections;
class Program
{
static void Main()
{
using (PdfDocument pdf = new PdfDocument())
{
// 创建作品集
PdfCollection collection = pdf.Collection;
// 创建文件夹
PdfFolder folder1 = collection.Folders.CreateSubfolder("项目文档");
PdfFolder folder2 = collection.Folders.CreateSubfolder("参考资料");
// 向根目录添加文件
collection.AddFile("readme.pdf");
// 向子文件夹添加文件
folder1.AddFile("设计文档.docx");
folder1.AddFile("需求说明.xlsx");
folder2.AddFile("技术参考.pdf");
pdf.SaveToFile("PortfolioWithFolders.pdf", FileFormat.PDF);
}
}
}
在这个场景下,Spire.PDF 还兼容在新建作品集时添加文件描述、设置文件图标等高级功能。
方案二:Aspose.PDF(企业级方案,功能最全面)
Aspose.PDF 借助 Document.Collection 和 FileSpecification 类实现作品集新建,兼容为每个文件添加描述信息。
安装:
Install-Package Aspose.PDF
示例代码:
using Aspose.Pdf;
class Program
{
static void Main()
{
// 创建文档并启用作品集集合
Document doc = new Document();
doc.Collection = new Collection();
// 准备要添加的文件
FileSpecification excel = new FileSpecification("data.xlsx");
excel.Description = "Excel 数据表";
FileSpecification word = new FileSpecification("report.docx");
word.Description = "Word 报告文档";
FileSpecification image = new FileSpecification("logo.png");
image.Description = "项目 Logo";
// 添加到作品集
doc.Collection.Add(excel);
doc.Collection.Add(word);
doc.Collection.Add(image);
// 保存
doc.Save("Portfolio.pdf");
}
}
注意:Aspose.PDF 建议采用版本 21 或更高版本,要求 .NET Framework 4.7.2 或 .NET Core/5+/6+。
方案三:GemBox.Pdf(兼容文件夹结构和自定义字段)
实际处理时,GemBox.Pdf 提供更精细的控制,兼容文件夹结构、自定义元数据字段以及设置作品集的初始显示文件。
安装:
Install-Package GemBox.Pdf
许可证说明:免费版有采用限制,生产环境需购买商业许可证。
示例代码:
using GemBox.Pdf;
using GemBox.Pdf.Portfolios;
class Program
{
static void Main()
{
// 免费版需设置许可证密钥
ComponentInfo.SetLicense("FREE-LIMITED-KEY");
using (var document = new PdfDocument())
{
// 将文档设置为 PDF 作品集
var portfolio = document.SetPortfolio();
// 添加文件到作品集根目录
portfolio.Files.Add("document.pdf");
portfolio.Files.Add("report.docx");
// 创建文件夹并添加文件
var folder = portfolio.Folders.Add("附件");
folder.Files.Add("image1.png");
folder.Files.Add("image2.jpg");
// 设置初始显示文件(第一个PDF文件)
portfolio.InitialFile = document.EmbeddedFiles
.FirstOrDefault(f => f.Name.EndsWith(".pdf"));
// 自定义字段:添加"FullName"字段
var field = portfolio.Fields.Add(PdfPortfolioFieldDataType.String, "FullName");
field.Value.Name = "Full Name";
field.Value.Order = 0;
document.Save("Portfolio.pdf");
}
}
}
方案四:Apryse(原 PDFTron,功能强大的商业库)
实际处理时,Apryse 借助操作 PDF 的底层对象模型来新建作品集,适合需深度控制的高级场景。
安装:
Install-Package PDFNet
示例代码:
using pdftron;
using pdftron.PDF;
class Program
{
static void AddPackage(PDFDoc doc, string filePath, string desc)
{
// 创建嵌入式文件名称树
NameTree files = NameTree.Create(doc, "EmbeddedFiles");
// 创建文件规格对象
FileSpec fs = FileSpec.Create(doc, filePath, true);
byte[] fileName = System.Text.Encoding.UTF8.GetBytes(filePath);
// 添加到名称树
files.Put(fileName, fs.GetSDFObj());
fs.GetSDFObj().PutText("Desc", desc);
// 创建或获取 Collection 字典
Obj collection = doc.GetRoot().FindObj("Collection");
if (collection == null)
collection = doc.GetRoot().PutDict("Collection");
// 设置初始视图模式
collection.PutName("View", "T");
}
static void Main()
{
PDFDoc doc = new PDFDoc();
AddPackage(doc, "document.pdf", "主文档");
AddPackage(doc, "image.png", "示意图");
doc.Save("Portfolio.pdf", SDFDocSaveOptions.e_linearized);
}
}
总结
在这个场景下,PDF 文件包能够将多个不同格式的文件整合到一个 PDF 容器中,同时保留每个文件原有的格式、分辨率和尺寸。借助编程方式新建 PDF 文件包时,能够根据实际需求将文件直接添加到文件包中,也能够新建文件夹对文件进行分类管理,从而提升文档组织和管理效率。
落到代码里,本文主要讲解了如何采用 C# 和 VB.NET 新建 PDF 文件包,同时演示了添加文件和新建文件夹的基本方法。在实际开发和测试过程中,如果需去除生成文档中的评估提示信息,或体验完整功能,能够申请 30 天临时许可证(Temporary License),以便在开发环境中进行更完整的功能测试。

