Extract2MD 是一个客户端 JavaScript 库,能将 PDF 格式的文件转换为 Markdown 格式。
Extract2MD提供5种不同的提取方法,你可以选择使用 LLM(Large Language Model)来进行增强。
Extract2MD针对不同的使用场景提供了五种不同的转换模式,支持快速转换和高精度转换,支持集成 LLM 增强模式。Extract2MD可以自定义配置,包括 PDF.js 和 Tesseract.js 的 worker 路径,LLM 模型和相关的选项。
Extract2MD高级用法支持使用单独的组件,自定义系统提示,从 JSON 文件加载配置,括错误处理和进度跟踪等很多实用的功能。
代码目录:包括src(核心代码)、scripts(脚本)、test(测试)等文件夹
配置文件:config.example.json、package.json等
文档资源:包括DEPLOYMENT.md(部署指南)、MIGRATION.md(迁移指南)、README.md(使用说明)等文档
辅助文件:.gitignore、.npmignore等版本控制相关的文件
Extract2MD提供了5种差异化的转换方案来处理PDF文件。
• 适用场景:PDF文件中包含可选中文字时的快速转换
• 技术实现:基于PDF.js的文本提取技术
• 输出效果:基础的Markdown格式
const markdown1 = await Extract2MDConverter.quickConvertOnly(pdfFile);
• 适用场景:处理含图片、扫描件或有复杂布局的PDF文件
• 技术实现:借助Tesseract.js进行OCR识别
• 输出效果:基于OCR提取的Markdown内容
const markdown2 = await Extract2MDConverter.highAccuracyConvertOnly(pdfFile);
• 适用场景:需要使用AI来优化格式的快速提取
• 技术实现:PDF.js文本提取结合WebLLM
• 输出效果:结构更清晰、可读性更强的AI增强Markdown
const markdown3 = await Extract2MDConverter.quickConvertWithLLM(pdfFile);
• 适用场景:使用AI对OCR提取的结果进行优化
• 技术实现:Tesseract.js OCR识别结合WebLLM
• 输出效果:经AI增强的OCR提取Markdown
const markdown4 = await Extract2MDConverter.highAccuracyConvertWithLLM(pdfFile);
• 适用场景:需要将多种提取方法结合使用的转换,用于PDF文件包含文字、图片等复杂的内容
• 技术实现:PDF.js文本提取+Tesseract.js OCR+WebLLM(包含专用提示词)
• 输出效果:结合多种提取方法后输出的Markdown
const markdown5 = await Extract2MDConverter.combinedConvertWithLLM(pdfFile);
通过配置对象或JSON文件,支持对转换过程进行定制:
const config = {
// PDF.js Worker配置
pdfJsWorkerSrc: "../pdf.worker.min.mjs",
// Tesseract OCR配置
tesseract: {
workerPath: "./tesseract-worker.min.js",
corePath: "./tesseract-core.wasm.js",
langPath: "./lang-data/",
language: "eng",
options: {}
},
// LLM配置
webllm: {
model: "Qwen3-0.6B-q4f16_1-MLC",
customModel: { // 自定义模型支持
model: "https://huggingface.co/mlc-ai/your-model/resolve/main/",
model_id: "YourModel-ID",
model_lib: "https://example.com/your-model.wasm",
required_features: ["shader-f16"],
overrides: { conv_template: "qwen" }
},
options: { temperature: 0.7, maxTokens: 4096 }
},
// 系统提示词定制
systemPrompts: {
singleExtraction: "Focus on preserving code examples exactly.", // 单提取场景提示
combinedExtraction: "Pay attention to tables and diagrams from OCR." // 组合提取场景提示
},
// 处理选项
processing: {
splitPascalCase: false,
pdfRenderScale: 2.5,
postProcessRules: [{ find: /\bAPI\b/g, replace: "API" }] // 后处理规则
},
// 进度回调
progressCallback: (progress) => {
console.log(`${progress.stage}: ${progress.message}`);
if (progress.currentPage) {
console.log(`Page ${progress.currentPage}/${progress.totalPages}`);
}
}
};
可以单独调用库内组件实现功能定制:
import { WebLLMEngine, OutputParser, ConfigValidator } from 'extract2md';
// 配置验证
const validatedConfig = ConfigValidator.validate(userConfig);
// 初始化LLM引擎
const engine = new WebLLMEngine(validatedConfig);
await engine.initialize();
// 生成文本
const result = await engine.generate("Your prompt here");
// 输出解析
const parser = new OutputParser();
const cleanMarkdown = parser.parse(result);
支持针对不同场景设置专属的系统提示词:
// 单提取场景提示词(方案3/4)
const singlePrompt = SystemPrompts.getSingleExtractionPrompt(
"Additional instruction: Preserve all technical terms."
);
// 组合提取场景提示词(方案5)
const combinedPrompt = SystemPrompts.getCombinedExtractionPrompt(
"Focus on creating comprehensive documentation."
);
通过配置进度回调函数可以实现监控实时状态:
const config = {
progressCallback: (progress) => {
switch (progress.stage) {
case 'scenario_5_start':
console.log('Starting combined conversion...');
break;
// 其他阶段状态处理
case 'webllm_load_progress':
console.log(`Loading model: ${progress.progress}%`);
break;
// 错误处理
if (progress.error) {
console.error('Error:', progress.error);
}
}
}
};
try {
const result = await Extract2MDConverter.combinedConvertWithLLM(pdfFile, config);
console.log('Success:', result);
} catch (error) {
console.error('Conversion failed:', error.message);
}
对于旧版API用户,可以通过Legacy接口进行过渡:
// 旧版用法
import { LegacyExtract2MDConverter } from 'extract2md';
const converter = new LegacyExtract2MDConverter(options);
const quick = await converter.quickConvert(pdfFile);
// 推荐新用法
const quick = await Extract2MDConverter.quickConvertOnly(pdfFile, config);
npm install extract2md
<script src="https://unpkg.com/[email protected]/dist/assets/extract2md.umd.js"></script>
<script>
const result = await Extract2MD.Extract2MDConverter.quickConvertOnly(pdfFile);
</script>
注意Worker文件路径配置(默认路径可在构建时自动复制)
const config = {
pdfJsWorkerSrc: "/pdf.worker.min.mjs",
tesseract: {
workerPath: "/tesseract-worker.min.js",
corePath: "/tesseract-core.wasm.js"
}
};
• 约11MB(含OCR和PDF处理模块)
• PDF.js:约950KB
• Tesseract.js:约4.5MB
• WebLLM:大小随模型不同有所变化