UNPKG

pdf-toolmd

Version:

Convert PDF to Markdown using Node.js

233 lines (165 loc) 7.06 kB
# PDF2MD Node.js <p align="center"> <img src="https://img.shields.io/badge/node-%3E%3D%2016.0.0-brightgreen" alt="Node.js 版本"> <img src="https://img.shields.io/badge/license-MIT-blue" alt="许可证"> </p> 一个强大的Node.js工具,使用先进的视觉模型将PDF文档转换为Markdown格式。PDF2MD从PDF中提取文本、表格和图像,并生成结构良好的Markdown文档。 ## ✨ 功能特点 - **全页处理**:将整个PDF页面转换为高质量图像进行处理 - **视觉模型集成**:利用最先进的视觉模型进行精确的文本提取 - **多模型支持**:兼容OpenAI、Claude、Gemini和豆包视觉模型 - **结构化输出**:生成干净、格式良好的Markdown文档 - **可定制**:配置图像质量、处理选项和输出格式 ## 🚀 安装 ```bash # 克隆仓库 git clone https://github.com/yourusername/pdf2md.git cd pdf2md/pdf2md-node # 安装依赖 npm install ``` ## 📋 系统要求 - Node.js 16.0.0 或更高版本 - 至少一个支持的视觉模型的API密钥 ## 🔧 使用方法 ### 基本用法 ```javascript import { parsePdf, getPageCount } from './src/index.js'; // 获取PDF页数 const pageCount = await getPageCount('path/to/your.pdf'); console.log(`PDF共有 ${pageCount} 页`); // 转换PDF为Markdown const result = await parsePdf('path/to/your.pdf', { apiKey: 'your-api-key', model: 'gpt-4-vision-preview', useFullPage: true // 使用全页处理模式 }); console.log(`Markdown文件已生成:${result.mdFilePath}`); ``` ### 配置选项 ```javascript const options = { // 生成文件的输出目录 outputDir: './output', // 视觉模型的API密钥 apiKey: 'your-api-key', // API端点(如果使用自定义端点) baseUrl: 'https://api.example.com/v1', // 要使用的视觉模型 model: 'gpt-4-vision-preview', // 视觉模型的自定义提示 prompt: '将此PDF转换为结构良好的Markdown', // 是否使用全页处理(推荐) useFullPage: true, // 是否保留中间图像文件 verbose: false, // 图像缩放因子(更高 = 更好的质量但更慢) scale: 3, // 是否使用openai兼容接口 openAiApicompatible: true, // 并发处理数量(可同时处理的页面数) concurrency: 2, //处理进度结果回调方法(方便调用者跟踪页面处理进度,只有taskStatus状态为finished时整个转换任务才算完成) onProgress: ({ current, total, taskStatus }) => { console.log(`已处理:${current},总页数:${total},任务处理状态:${taskStatus}`); } }; const result = await parsePdf('path/to/your.pdf', options); ``` ## 🔍 支持的模型 | 提供商 | 模型 | |----------|--------| | OpenAI | `gpt-4-vision-preview`, `gpt-4o` | | Claude | `claude-3-opus-20240229`, `claude-3-sonnet-20240229` | | Gemini | `gemini-pro-vision` | | 豆包 | `doubao-1.5-vision-pro-32k-250115` | ## 🧪 测试 项目包含多个测试脚本以验证功能: ```bash # 测试完整的PDF到Markdown转换流程 node test/testFullProcess.js # 仅测试PDF到图像的转换 node test/testFullPageImages.js # 测试特定视觉模型 node test/testModel.js ``` ## 📁 项目结构 ``` pdf2md-node/ ├── src/ │ ├── index.js # 主入口点 │ ├── pdfParser.js # PDF解析模块 │ ├── imageGenerator.js # 图像生成模块 │ ├── modelClient.js # 视觉模型客户端 │ ├── markdownConverter.js # Markdown转换模块 │ └── utils.js # 工具函数 ├── test/ │ ├── samples/ # 用于测试的示例PDF文件 │ ├── testFullProcess.js # 完整流程测试 │ └── ... (其他测试文件) └── package.json ``` ## 🔄 模块架构 PDF2MD由以下核心模块组成,每个模块负责特定功能: ### 1. 主入口模块 (index.js) 协调整个系统: - 接收用户输入(PDF路径和配置选项) - 按顺序调用其他模块完成转换过程 - 返回最终的Markdown结果 ### 2. PDF解析模块 (pdfParser.js) 解析PDF文件并提取结构化信息: - 使用PDF.js库加载PDF文件 - 提取每页的文本内容、图像和图形元素 - 生成矩形区域列表,每个矩形代表PDF中的内容块 ### 3. 图像生成模块 (imageGenerator.js) 将PDF区域渲染为图像: - 使用PDF.js渲染引擎将指定区域渲染为高清图像 - 支持可调节的缩放比例,确保图像清晰度 - 使用Sharp库处理和优化图像 ### 4. 模型客户端模块 (modelClient.js) 与各种视觉模型API交互: - 支持多种视觉模型:OpenAI、Claude、Gemini、豆包等 - 提供统一的API调用接口,封装不同模型的特性 - 处理API调用错误和重试机制 ### 5. Markdown转换模块 (markdownConverter.js) 将模型结果转换为标准Markdown格式: - 处理模型返回的文本内容 - 按照Markdown语法标准格式化 - 合并多个区域的Markdown内容 ## 📄 许可证 本项目采用MIT许可证 - 详情请参阅LICENSE文件。 ## 数据流程与模块协作 PDF到Markdown的转换过程按照以下流程进行: 1. **输入处理**:主入口模块接收PDF文件路径和配置选项 2. **PDF解析** - `pdfParser.js` 加载PDF文件 - 提取每一页的内容元素 - 生成初始矩形区域列表 3. **矩形处理** - `rectProcessor.js` 接收初始矩形列表 - 调用 `mergeRects` 函数合并相近的矩形 - 调用 `adsorbRects` 函数吸附小矩形 - 调用 `filterSmallRects` 函数过滤小矩形 - 返回优化后的矩形列表 4. **图像生成** - `imageGenerator.js` 接收优化后的矩形列表 - 对每个矩形区域调用 `renderRectToImage` 函数 - 生成高清图像并保存 - 返回图像路径列表 5. **模型识别** - `modelClient.js` 接收图像路径列表 - 根据配置选择适当的视觉模型 - 调用模型 API对图像进行内容识别 - 返回模型分析结果 6. **Markdown转换** - `markdownConverter.js` 接收模型分析结果 - 将结果转换为标准Markdown格式 - 按照区域在PDF中的位置合并内容 - 生成最终的Markdown文档 7. **输出结果**:主入口模块返回最终的Markdown内容 ## 实现原理 1. **PDF解析与区域识别**:使用PDF.js解析PDF文件,识别出文档中的文本区域、图片区域和绘图元素 2. **区域分割与合并**:将相近的区域合并,识别出PDF中的逻辑块 3. **区域转图像**:将每个识别出的区域转换为高清图像 4. **图像OCR与解析**:使用视觉模型API对生成的图像进行内容识别和转换为Markdown 5. **结果合并**:将所有区域的Markdown内容合并成完整的文档