PDF文档在日常工作中几乎无处不在,无论是合同、报告还是技术手册,都离不开它的身影。在.NET生态下,如何高效地处理PDF——比如提取内容、编辑、转换格式——一直是开发者关注的话题。今天要聊的DocNET库,正是一个基于Chromium的PDFium引擎封装的轻量级工具,既能跨平台运行,又保持了不错的性能。
项目介绍
DocNET是一个开源(MIT license)的.NET库,支持Windows、Linux和macOS三大平台。它的底层是C++编写的PDFium(Chromium项目中的PDF渲染引擎),而对外暴露的是.NET Standard 2.0接口,这意味着你可以在.NET Framework、.NET Core乃至最新的.NET 9项目中直接使用。简单来说,它把复杂的PDF处理逻辑封装成了简洁的API,让开发者可以专注于业务逻辑,而不是PDF底层协议。
项目特性
DocNET的功能覆盖了日常开发中最常见的几个场景:
- PDF提取:支持获取PDF版本、页数、页面尺寸、页面文本内容,甚至能提取字符的字体大小等元信息。
- PDF编辑:提供了分割、合并、解锁等基础操作,足以应对大部分文档管理需求。
- 格式转换:可以将PDF页面渲染为图像,也可以把JPEG图片转换为PDF文件,逆向操作也能轻松搞定。
这些特性组合起来,基本覆盖了从“读取”到“输出”的完整链路。
项目源代码

创建DocNETExercises控制台应用
先创建一个名为 DocNETExercises 的.NET 9控制台应用程序,这是后续所有示例的载体。


Docnet.Core NuGet包安装
在NuGet包管理器中搜索 Docnet.Core 并安装即可。注意选择与项目目标框架兼容的版本。

获取 PDF 文件页码和版本
这是最基础的操作——拿到一份PDF,总得先知道它有多少页、是什么版本。DocNET通过 GetDocReader 打开文档后,调用 GetPageCount() 和 GetPdfVersion() 即可获取。注意创建 DocReader 时需要传入页面尺寸参数,这里我们用了1080×1920,可以根据实际渲染需求调整。
////// 获取 PDF 文件页码和版本 /// public static void GetPDFPageCountAndVersion() { using var docReader = _docNetInstance.GetDocReader(FilePath, new PageDimensions(1080, 1920)); var getPageCount = docReader.GetPageCount(); var getPdfVersion = docReader.GetPdfVersion(); Console.WriteLine($"PageCount:{getPageCount},PdfVersion:{getPdfVersion}"); }

获取 PDF 文件的文本内容
提取文本是PDF处理中的高频需求。DocNET支持按页读取,注意 GetPageReader 的索引从0开始。调用 GetText() 即可拿到该页面的纯文本内容,内部自动处理了字符编码,省去了不少麻烦。
////// 获取 PDF 文件的文本内容 /// public static void GetPDFText() { using var docReader = _docNetInstance.GetDocReader(FilePath, new PageDimensions(1080, 1920)); using var pageReader = docReader.GetPageReader(0); //注意pageIndex从0开始 // 获取指定页面的文本(自动处理编码) string pageText = pageReader.GetText(); Console.WriteLine(pageText); }

将 JPEG 图片转换为 PDF 文件
有时候需要把图片统一打包成PDF,比如扫描件存档。DocNET提供了 JpegToPdf 方法,只需传入图片字节数组和尺寸信息,返回的字节可以直接写入文件。注意图片路径和尺寸需要根据实际情况调整。
////// 将 JPEG 图片转换为 PDF 文件 /// public static void JPEGImageConvertToPDF() { var file = new JpegImage { Bytes = File.ReadAllBytes("Assets/image1.jpeg"), Width = 580, Height = 387 }; var bytes = _docNetInstance.JpegToPdf(new[] { file }); File.WriteAllBytes("Assets/output_file.pdf", bytes); }

将 PDF 文件转换为图片
反向操作同样常用——把PDF页面渲染成图片,比如生成预览图。这里需要逐页处理:先获取页面读取器,然后通过 GetImage() 拿到原始字节,再结合页面尺寸构建Bitmap。示例中还额外演示了如何用红色矩形框标注每个字符的位置,这在OCR或内容分析场景中很有用。
////// 将 PDF 文件转换为图片 /// public static void PDFConvertToImage() { using var docReader = _docNetInstance.GetDocReader(FilePath, new PageDimensions(1080, 1920)); //指定第一页 using var pageReader = docReader.GetPageReader(0); var rawBytes = pageReader.GetImage(); var width = pageReader.GetPageWidth(); var height = pageReader.GetPageHeight(); var characters = pageReader.GetCharacters(); using var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb); AddBytes(bmp, rawBytes); DrawRectangles(bmp, characters); using var stream = new MemoryStream(); bmp.Sa ve(stream, ImageFormat.Png); File.WriteAllBytes("Assets/output_image.png", stream.ToArray()); } private static void AddBytes(Bitmap bmp, byte[] rawBytes) { var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); var bmpData = bmp.LockBits(rect, ImageLockMode.WriteOnly, bmp.PixelFormat); var pNative = bmpData.Scan0; Marshal.Copy(rawBytes, 0, pNative, rawBytes.Length); bmp.UnlockBits(bmpData); } private static void DrawRectangles(Bitmap bmp, IEnumerablecharacters) { var pen = new Pen(Color.Red); using var graphics = Graphics.FromImage(bmp); foreach (var c in characters) { var rect = new Rectangle(c.Box.Left, c.Box.Top, c.Box.Right - c.Box.Left, c.Box.Bottom - c.Box.Top); graphics.DrawRectangle(pen, rect); } }

项目源码地址
更多实用功能和特性,欢迎前往项目开源地址查看。
- GitHub开源地址:https://github.com/GowenGit/docnet
- 本文示例源码地址:https://github.com/YSGStudyHards/DotNetExercises/tree/master/DocNETExercises