.NET 免费开源强大的 PDF 类库(PDFSharp)

1,187 阅读5分钟

前言

.NET 体系下的PDF处理类库多种多样,如Aspose、QuestPDF、Spire和iTextSharp等,它们各有千秋且功能强大。

然而,这些库要么是商业产品价格高昂(可以理解收费模式),要么是开源版本附带各种限制条件。

例如,Spire的开源版本有诸多限制,而iTextSharp虽然没有使用限制,但其AGPL开源协议并不适合闭源商业软件。

推荐一款基于.NET 6的跨平台、免费开源(MIT协议)的PDF处理库——PDFSharp。该库不仅支持.NET Framework,还提供了一个活跃的社区论坛(PDFsharp & MigraDoc Forum)。

经过一段时间的试用,发现PDFSharp及其姊妹项目MigraDoc能够满足大多数PDF生成和编辑需求,并且其灵活性和功能性都相当出色。

本文将详细介绍如何利用PDFSharp库进行PDF文件的创建与编辑,分享在实际应用中的经验,并提供一些实用的例子供大家参考。

.NET 平台常见的PDF类库

Aspose:reference.aspose.com/

QuestPDF:www.questpdf.com/

Spire:www.e-iceblue.cn/Introduce/S…

iTextSharp:github.com/itext/itext…

PDFSharp 简介

PDFSharp 是一个基于.NET的开源库,专门用于处理PDF文档。

它支持从零开始创建PDF文件,也可以对现有PDF文件进行修改。

PDFSharp的特点在于其简洁的API设计和强大的布局引擎,使我们能够轻松地实现复杂的PDF文档生成任务。

另外,PDFSharp还有一个姊妹项目——MigraDoc Foundation,专注于文档对象模型的构建,并能将文档渲染为PDF或RTF格式。

主要功能

创建PDF:无需模板,直接从头开始构建PDF文档。

内容插入:支持文本、图像、表格和图形等元素的添加。

格式化:提供字体选择、颜色设定和布局调整等功能,实现高度定制化。

合并与拆分:可以合并多个PDF文件或拆分单个PDF文件。

加密与解密:设置安全选项,保护PDF内容不被非法访问。

优势特点

简单易用:简洁的API设计,便于快速上手和使用。

全面功能:涵盖创建、编辑、合并、拆分、转换和加密等多种操作,满足不同需求。

应用场景

PDFSharp 广泛应用于生成报告、创建电子书、生成发票和合同等。无论是个人用户还是企业用户,都能从中受益。

PDFsharp示例

下面将详细解释示例中的所有代码,分为两个部分:创建文档和渲染文档。

设置字体解析器

为了确保文档所需的所有字体都能被解析,在使用MigraDoc的核心开发时(请参阅选择PDFsharp开发)需要设置字体解析器:

// 核心构建不使用Windows字体,
// 因此需要设置一个处理样本所需字体的FontResolver。
GlobalFontSettings.FontResolver = new SamplesFontResolver();

对于自己的项目,应该创建一个支持所需字体的自定义字体解析器。

请注意,SamplesFontResolver从PDFsharp.Samples特定的资源文件夹加载字体,而需要以一种不需要依赖仓库的方式提供字体文件。

创建文档

示例执行其 CreateDocument函数,其中包含以下代码:

//创建一个新的MigraDoc文档。
var document = new Document();

//向文档添加一个节点。
var section = document.AddSection();

创建了一个MigraDoc文档和一个节点,因为文档的所有内容都组织在节点中。

接下来,继续添加以下代码:

// 节点中添加一个段落。
var paragraph = section.AddParagraph();

// 设置字体颜色。
paragraph.Format.Font.Color = Colors.DarkBlue;

// 向段落添加一些文本。
paragraph.AddFormattedText("Hello, World!", TextFormat.Bold);

向节点中添加了一个段落,并将整个段落的字体颜色设置为深蓝色。

然后,添加了带有"Hello, World!"内容并设置为粗体的格式化文本。

之后,创建并填充页脚:

// 创建主要页脚。
var footer = section.Footers.Primary;

// 向页脚添加内容。
paragraph = footer.AddParagraph();
paragraph.Add(new DateField { Format = "yyyy/MM/dd HH:mm:ss" });
paragraph.Format.Alignment = ParagraphAlignment.Center;

主要页脚添加了一个段落,并在其中添加了日期字段,同时将整个段落设置为中心对齐。

最后,向节点中添加图像:

// 添加MigraDoc标志。
string imagePath = IOUtility.GetAssetsPath(@"migradoc/images/MigraDoc-128x128.png")!;
document.LastSection.AddImage(imagePath);

GetAssetsPath调用仅获取图像路径,重要的是第二行,它将图像添加到节中。

在返回CreateDocument后,修改Normal样式:

var style = document.Styles[StyleNames.Normal]!;
style.Font.Name = "Arial";

Normal样式是所有其他段落样式的默认样式。因此,Arial字体将继承到文档中的所有对象,除非被覆盖。

渲染文档

当文档创建完成后,开始渲染。

首先,创建PdfDocumentRenderer实例:

// 创建一个用于MigraDoc文档的渲染器。
var pdfRenderer = new PdfDocumentRenderer
{
    // 将MigraDoc文档与渲染器关联。
    Document = document,
    PdfDocument =
    {
        // 在渲染MigraDoc文档之前更改一些设置。
        PageLayout = PdfPageLayout.SinglePage,
        ViewerPreferences =
        {
            FitWindow = true
        }
    }
};

创建了PdfDocumentRenderer实例,将其与创建的文档关联,并设置一些PDF文件的属性。

然后渲染并保存文档:

// 布局并渲染文档为PDF。
pdfRenderer.RenderDocument();

// 保存文档...
var filename = PdfFileUtility.GetTempPdfFullFileName("samples-MigraDoc/HelloWorldMigraDoc");
pdfRenderer.PdfDocument.Save(filename);

// ...并在PDF查看器中打开。
PdfFileUtility.ShowDocument(filename);

RenderDocument 将 MigraDoc文档实例渲染为PDFsharp的PdfDocument实例。

Save方法将PDFsharp文档保存到指定文件中。

总结

以上仅展示了PDFSharp库的部分功能。更多实用特性和详细信息,请大家访问项目地址。

希望通过本文能为.NET PDF文档处理和开发方面提供有价值的参考。欢迎在评论区留言交流,分享您的宝贵经验和建议。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!