.NET 使用 DocNET 库快速高效的操作 PDF 文档

前言

PDF 文档,作为日常工作中不可或缺的文档格式,广泛应用于各类场景。今天我们来讲讲在 .NET 中使用 DocNET 库快速高效的操作 PDF 文档。

项目介绍

DocNET 是一个基于 .NET 开源(MIT license)、跨平台(支持Windows、Linux和macOS平台)的旨在提供快速 PDF 编辑和数据提取的操作库。它是基于 Chromium 所使用的 PDFium C++ 库开发的 .NET Standard 2.0 封装库。

项目特性

  • PDF 提取功能:支持 PDF 版本、页数、页面宽度、页面高度、页面文本、字符字体大小等相关PDF信息提取。
  • PDF 编辑功能: 支持分割 PDF 文档、合并 PDF 文档、解锁 PDF 文档。
  • 支持渲染页面为图像、JPEG 图片转换为 PDF 文件等等。

项目源代码

创建DocNETExercises控制台应用

创建一个名为 DocNETExercises 的.NET 9 控制台应用:

Docnet.Core NuGet包安装

在 NuGet 包管理器中搜索 Docnet.Core 安装:

获取 PDF 文件页码和版本

csharp 复制代码
        /// <summary>
        /// 获取 PDF 文件页码和版本
        /// </summary>
        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 文件的文本内容

csharp 复制代码
        /// <summary>
        /// 获取 PDF 文件的文本内容
        /// </summary>
        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 文件

csharp 复制代码
        /// <summary>
        /// 将 JPEG 图片转换为 PDF 文件
        /// </summary>
        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 文件转换为图片

ini 复制代码
        /// <summary>
        /// 将 PDF 文件转换为图片
        /// </summary>
        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.Save(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, IEnumerable<Character> characters)
        {
            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);
            }
        }

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

相关推荐
lazy H2 分钟前
从入门到日常开发,一篇文章掌握 Git 核心操作
git·后端·学习·github
GetcharZp8 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
weixin_4462608511 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
ttwuai13 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
用户83562907805113 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
用户99314415798413 小时前
微服务框架中获取用户信息
后端
xuanWb13 小时前
手写一个 LLM API 网关:Anthropic 与 OpenAI 协议转换的完整实现
后端
苍何13 小时前
给 Codex 换皮肤这门生意,被我开源了
后端
用户83562907805113 小时前
Python 实现 Excel 命名范围(Named Range)的创建与管理
后端·python