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主要功能

Extract2MD提供了5种差异化的转换方案来处理PDF文件。

方案1:快速转换

• 适用场景:PDF文件中包含可选中文字时的快速转换

• 技术实现:基于PDF.js的文本提取技术

• 输出效果:基础的Markdown格式

const markdown1 = await Extract2MDConverter.quickConvertOnly(pdfFile);
方案2:高精度OCR转换

• 适用场景:处理含图片、扫描件或有复杂布局的PDF文件

• 技术实现:借助Tesseract.js进行OCR识别

• 输出效果:基于OCR提取的Markdown内容

const markdown2 = await Extract2MDConverter.highAccuracyConvertOnly(pdfFile);
方案3:快速转换+LLM增强

• 适用场景:需要使用AI来优化格式的快速提取

• 技术实现:PDF.js文本提取结合WebLLM

• 输出效果:结构更清晰、可读性更强的AI增强Markdown

const markdown3 = await Extract2MDConverter.quickConvertWithLLM(pdfFile);
方案4:高精度转换+LLM增强

• 适用场景:使用AI对OCR提取的结果进行优化

• 技术实现:Tesseract.js OCR识别结合WebLLM

• 输出效果:经AI增强的OCR提取Markdown

const markdown4 = await Extract2MDConverter.highAccuracyConvertWithLLM(pdfFile);
方案5:组合提取+LLM增强(推荐方案)

• 适用场景:需要将多种提取方法结合使用的转换,用于PDF文件包含文字、图片等复杂的内容

• 技术实现:PDF.js文本提取+Tesseract.js OCR+WebLLM(包含专用提示词)

• 输出效果:结合多种提取方法后输出的Markdown

const markdown5 = await Extract2MDConverter.combinedConvertWithLLM(pdfFile);

Extract2MD配置和使用

配置系统

通过配置对象或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."
);

Extract2MD 错误处理

通过配置进度回调函数可以实现监控实时状态:

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);
}

Extract2MD 新旧版本兼容

对于旧版API用户,可以通过Legacy接口进行过渡:

// 旧版用法
import { LegacyExtract2MDConverter } from 'extract2md';
const converter = new LegacyExtract2MDConverter(options);
const quick = await converter.quickConvert(pdfFile);

// 推荐新用法
const quick = await Extract2MDConverter.quickConvertOnly(pdfFile, config);

Extract2MD安装部署

NPM安装
npm install extract2md
CDN引用
<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"
  }
};
Extract2MD包大小

• 约11MB(含OCR和PDF处理模块)

• PDF.js:约950KB

• Tesseract.js:约4.5MB

• WebLLM:大小随模型不同有所变化