# pdfer **Repository Path**: chp452136/pdfer ## Basic Information - **Project Name**: pdfer - **Description**: 纯c#实现解析pdf,最终目的 提取图片及文本 页面渲染 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2025-03-28 - **Last Updated**: 2026-02-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Pdfer ## 介绍 Pdfer 是一个纯 C# 实现的 PDF 解析与渲染类库。本项目旨在提供一个无需依赖外部组件(如 `iTextSharp` 或 `Pdfium`)的解决方案,用于读取 PDF 文件结构、提取文本信息以及将页面渲染为图像。 项目目前已实现 PDF 内容的基础解析功能,包括对象结构、交叉引用表(XRef)、文件trailer、过滤器解码以及基于 SkiaSharp 的页面渲染引擎。 ## 功能特点 - **PDF 结构解析**:支持解析 PDF 文件对象、交叉引用表(XRef)和文件尾部信息。 - **元数据读取**:支持读取文档属性(标题、作者、创建日期、版本等)。 - **书签与大纲**:支持读取 PDF 文档的书签(Outlines/Bookmarks)结构。 - **文本提取**:能够解析页面内容流(Content Stream)并提取文本。 - **页面渲染**:基于 SkiaSharp 提供高质量的页面渲染功能,支持输出 PNG/Bitmap。 - **图像提取**:支持提取嵌入在 PDF 页面中的图像资源。 - **丰富的滤镜支持**:内置多种 PDF 滤镜解码器,包括 FlateDecode、LZWDecode、ASCII85Decode、ASCIIHexDecode、RunLengthDecode、DCTDecode、JBIG2Decode、CCITTFaxDecode 等。 - **字体支持**:支持 Type0 (Composite)、Type1、TrueType、Type3 以及 CID 字体的基础解析与渲染。 ## 项目结构 该项目按照功能模块进行了清晰的划分,主要包含以下核心部分: - **Syntax (语法解析)**:负责 PDF 语法的底层解析,包括 PostScript 词法分析器(`PSCompilationEngineV2`)和 XRef 表解析工具(`PdfParserUtils`)。 - **FileObjects (文件对象)**:定义了 PDF 规范中的基本对象模型(`PdfFileObject`)以及引用表(`XRefTable`)。 - **PdfObjecs (高级对象)**:封装了 PDF 文档的高级结构,如页面树(`PagesDictionary`, `PageDictionary`)、文档目录(`DocCatalogDictionary`)、字体定义(`FontType*Dictionary`)以及图形参数(`GraphicsStateParameterDictionary`)等。 - **Filters (滤镜)**:实现了各种 PDF 流的压缩与编码解码算法,是解析压缩内容流的关键。 - **Renders (渲染引擎)**:核心渲染模块,包含渲染引擎(`RenderEngine`)、图形状态管理(`GraphicsState`)以及基于 SkiaSharp 的具体实现(`SkiaGraphicPainter`, `SkiaFontManager`)。 - **Encodings (编码)**:处理字体编码映射。 ## 依赖 本项目主要依赖以下第三方库: - **SkiaSharp**:用于跨平台的 2D 图形渲染。 - **System.Numerics**:用于向量和矩阵运算(图形变换)。 你可以在 `src/pdfer/pdfer.csproj` 文件中查看完整的 NuGet 依赖项。 ## 快速开始 ### 安装 请确保你的开发环境已安装 .NET SDK。你可以通过 Git 克隆本仓库并构建: ```bash git clone https://gitee.com/chp452136/pdfer.git cd pdfer/src dotnet build ``` ### 使用示例 以下代码演示了如何使用 Pdfer 库加载 PDF 文档、获取元数据以及将第一页渲染为图片。 ```csharp using pdfer; // 1. 加载 PDF 文档 using var pdfDocument = new PdfDocument("sample.pdf"); // 2. 读取元数据 if (pdfDocument.Metadata != null) { Console.WriteLine($"标题: {pdfDocument.Metadata.Title}"); Console.WriteLine($"作者: {pdfDocument.Metadata.Author}"); Console.WriteLine($"页数: {pdfDocument.Page}"); } // 3. 读取书签 (如果存在) var bookmarks = pdfDocument.PdfBookmarks; if (bookmarks != null && bookmarks.Count > 0) { Console.WriteLine("检测到书签..."); } // 4. 渲染第一页 (宽度设为 800 像素,高度自动计算) byte[] imageBytes = pdfDocument.Render(0, width: 800); File.WriteAllBytes("page_0.png", imageBytes); // 5. 提取文本 var textLines = pdfDocument.GetText(0); foreach (var line in textLines) { Console.WriteLine(line); } ``` ## 测试 项目包含一个测试项目 `pdfer-test`,涵盖了以下测试用例: - **元数据与书签加载**:验证文档属性和大纲的读取。 - **滤镜测试**:测试 Flate、LZW 等解码器的正确性。 - **图像导出**:测试页面图像资源的提取与渲染。 你可以进入 `src/pdfer-test` 目录并运行测试: ```bash cd src/pdfer-test dotnet test ``` ## 参考资料 本项目的实现参考了以下公开资料: 1. **PDF Explained**: [https://zxyle.github.io/PDF-Explained/](https://zxyle.github.io/PDF-Explained/) 2. **PDF 1.7 标准参考**: 位于 `resource/pdf_reference_1.7.pdf` ## 许可证 本项目遵循 LICENSE 文件中所述的协议。 ## 写在最后 2026年了,在AI日新月异的发展的刺激下,越来越觉得代码本身的意义不值得拿出来提了,所以后续这个项目就作为保持自己编码能力和自己兴趣所然的一个项目了,既然打不过就加入,也希望每一位同行能在AI的浪潮下找到自己的位置,共勉。