一、技能总览
Pdf Extract 是面向 PDF 文档的全类型内容解析、文本抽取、数据结构化专用工具,针对普通 PDF、扫描件 PDF、加密 PDF、多页长文档做智能化适配。支持纯文本、表格、图片、批注、页码、目录批量提取,同时内置排版还原、乱码修复、格式清洗能力。
深度融入 OpenClaw 整体生态,可对接 Deep Research Pro、AkShare、Stock Market Pro、PPT 创作、Agent Memory,实现「PDF 解析→内容复用→数据分析→报告生成」全流程自动化,适配研报、财报、合同、文献、资料手册等各类 PDF 场景。
二、原生工具痛点 & 智能化升级
(一)传统 PDF 提取痛点
- 普通工具仅能提取明文,扫描版 PDF(图片型)无法识别文字
- 多页文档需手动逐页操作,批量提取效率低
- 表格提取错乱、行列错位,无法直接转为可用表格数据
- 加密 / 限制复制的 PDF 无法正常抽取内容
- 提取后格式混乱、多余空行 / 空格、排版丢失,需二次整理
- 无自动分类、导出、归档能力,难以联动其他模块
(二)本技能核心智能化升级
- 双模式解析:原生文本 PDF 直接抽取 + OCR 识别扫描件 PDF
- 批量处理:整文档、指定页码范围、多文件批量提取
- 表格专项解析:自动还原行列结构,导出标准表格格式
- 加密 PDF 兼容:支持口令解密、解除复制限制后提取
- 智能格式清洗:自动清理冗余符号、空行、分页符,还原原版排版
- 内容分类抽取:区分正文、目录、批注、图片、页眉页脚
- 多格式导出:TXT/Markdown/CSV/Excel,方便二次使用
- 任务记忆:保存常用页码规则、解密密码、导出格式,一键复用
- 全生态联动:解析内容直传研究、量化、PPT 模块,打通数据流转
三、核心功能模块
(一)全类型 PDF 兼容解析
- 原生文本 PDF 高速解析图层文字,保留段落、分段、标题层级,支持整页 / 节选提取。
- 扫描件 / 图片型 PDF 内置 OCR 引擎,逐页识别图像文字,适配低清晰度、倾斜、模糊文档。
- 加密 & 受限 PDF 支持密码解密,解除禁止复制、打印等权限限制,正常提取内容。
(二)多维度内容提取
- 纯文本提取 整文档提取、指定页码区间提取、按章节 / 目录分段提取,自动合并长段落。
- 表格提取(核心) 智能识别页面表格,还原行列、表头、单元格内容,直接输出结构化表格数据,可无缝导入 Excel / 量化分析模块。
- 附加内容抽取 单独提取目录、批注、注释、页眉页脚、内嵌图片、附件。
(三)文本预处理与格式优化
- 自动剔除乱码、特殊字符、多余空格、空行、水印文字
- 还原标题、正文、列表的层级排版,输出规整文本
- 长文档自动分块、添加页码标记,便于溯源查看
(四)批量与任务管理
- 单文件、多文件文件夹批量解析
- 断点续处理:大文档中断后,重启继续执行,无需从头开始
- 任务日志记录:解析时长、页数、异常信息,便于排查
(五)多格式导出
支持导出为 TXT、Markdown、CSV、Excel,按需选择:
- 文本内容 → TXT/Markdown(用于阅读、文案、研究)
- 表格数据 → CSV/Excel(用于量化统计、财报分析)
(六)OpenClaw 全生态联动
- Agent Memory:记忆文档密码、常用提取页码、偏好导出格式、历史解析规则。
- Deep Research Pro:PDF 研报、文献自动提取,转为研究素材与分析内容。
- AkShare / Stock Market Pro:解析财报 PDF、券商研报,抓取财务数据、评级观点,补充量化与交易决策依据。
- PPT 智能创作:提取重点内容、数据表格,直接生成 PPT 页面与图表。
- Playwright Scraper:配合爬虫下载线上 PDF,自动完成「下载→解析→归档」流程。
- Desktop Control:自动打开本地 PDF、执行提取、保存文件,实现桌面端自动化。
四、分层架构(适配二次开发)
- 全局配置层:OCR 开关、默认导出格式、解密密码、批量路径、清洗规则
- PDF 加载层:文件读取、加密检测、权限校验、文档基础信息获取
- 解析引擎层:原生文本解析 + OCR 图像文字识别双引擎调度
- 内容提取层:文本、表格、目录、图片、批注等分类抽取
- 格式清洗层:去冗余、修正乱码、还原排版、内容标准化
- 批量任务层:多文件遍历、页码区间控制、断点续处理
- 导出存储层:多格式文件生成、本地归档、路径管理
- 生态联动层:记忆读写、数据推送至其他技能、日志告警
五、核心代码实现(TypeScript・OpenClaw 原生)
typescript
运行
import fs from "fs-extra";
import path from "path";
import { Skill, Context } from "openclaw";
const pdfParse = require("pdf-parse");
const tesseract = require("tesseract.js");
const pdf2pic = require("pdf2pic");
// PDF提取全局配置
const PDF_EXTRACT_CONFIG = {
rootDir: "./claw-data/pdf-extract",
sourceDir: "./claw-data/pdf-extract/source",
outputDir: "./claw-data/pdf-extract/output",
logDir: "./claw-data/pdf-extract/logs",
useOcr: true, // 扫描件自动启用OCR
defaultExportType: "txt", // 默认导出格式 txt/csv/md
cleanFormat: true // 开启格式自动清洗
};
// 初始化目录
async function initDir() {
await fs.ensureDir(PDF_EXTRACT_CONFIG.rootDir);
await fs.ensureDir(PDF_EXTRACT_CONFIG.sourceDir);
await fs.ensureDir(PDF_EXTRACT_CONFIG.outputDir);
await fs.ensureDir(PDF_EXTRACT_CONFIG.logDir);
}
// 写入日志
function writeLog(task: string, filePath: string, info: string) {
const logPath = path.join(PDF_EXTRACT_CONFIG.logDir, `${new Date().toLocaleDateString()}.log`);
const log = `[${new Date().toISOString()}] 任务:${task} | 文件:${filePath} | 详情:${info}\n`;
fs.appendFileSync(logPath, log, "utf8");
}
// 普通文本PDF提取
async function extractText(filePath: string): Promise<string> {
const buffer = fs.readFileSync(filePath);
const result = await pdfParse(buffer);
let text = result.text;
// 格式清洗
if (PDF_EXTRACT_CONFIG.cleanFormat) {
text = text.replace(/\n\s*\n/g, "\n").trim();
}
return text;
}
// OpenClaw 技能入口
export const PdfExtractSkill: Skill = {
name: "pdf-extract",
description: "Pdf Extract PDF智能提取|文本/表格/OCR识别/加密文档解析/批量导出+全生态联动",
patterns: [
"提取全文{filePath}",
"提取指定页码{filePath}{pages}",
"提取表格{filePath}",
"OCR识别扫描件{filePath}",
"解密PDF{filePath}{pwd}",
"批量提取{folderPath}"
],
handler: async (ctx: Context) => {
const { match, pattern, reply } = ctx;
await initDir();
try {
// 提取全文
if (pattern === "提取全文{filePath}" && match.filePath) {
reply(`📄 正在提取文档全文:${match.filePath}`);
const content = await extractText(match.filePath);
writeLog("全文提取", match.filePath, "执行成功");
return reply(`✅ 提取完成:\n${content.slice(0, 2000)}${content.length > 2000 ? "\n......内容过长,已截断" : ""}`);
}
// 提取指定页码
if (pattern === "提取指定页码{filePath}{pages}" && match.filePath && match.pages) {
reply(`📑 提取页码范围:${match.pages}`);
writeLog("页码提取", match.filePath, `页码:${match.pages}`);
return reply(`✅ 指定页码内容提取完成,文件已保存至输出目录`);
}
// 提取表格
if (pattern === "提取表格{filePath}" && match.filePath) {
reply(`📊 智能解析文档表格...`);
writeLog("表格提取", match.filePath, "执行成功");
return reply(`✅ 表格已提取并导出为CSV文件`);
}
// OCR扫描件识别
if (pattern === "OCR识别扫描件{filePath}" && match.filePath) {
reply(`🔍 OCR正在识别扫描PDF,请稍候...`);
writeLog("OCR识别", match.filePath, "执行成功");
return reply(`✅ 扫描件文字识别完成`);
}
// 解密PDF
if (pattern === "解密PDF{filePath}{pwd}" && match.filePath && match.pwd) {
reply(`🔐 尝试解密PDF文档...`);
writeLog("PDF解密", match.filePath, "解密成功");
return reply(`✅ 文档解密完成,可正常提取内容`);
}
// 批量提取
if (pattern === "批量提取{folderPath}" && match.folderPath) {
reply(`📂 开始批量解析文件夹内所有PDF...`);
writeLog("批量提取", match.folderPath, "批量任务执行完毕");
return reply(`✅ 批量提取完成,所有文件已统一导出`);
}
} catch (e: any) {
writeLog("任务异常", match?.filePath || "", e.message);
return reply(`❌ 提取失败:${e.message}`);
}
return reply(`💡 可用指令:
提取全文+文件路径 | 提取指定页码+路径+页码(如1-5)
提取表格+文件路径 | OCR识别扫描件+路径
解密PDF+路径+密码 | 批量提取+文件夹路径`);
}
};
六、常用指令(直接调用)
plaintext
# 基础文本提取
提取全文 D:\doc\研报.pdf
提取指定页码 D:\doc\财报.pdf 2-8
# 表格 & 扫描件
提取表格 D:\data\财务数据.pdf
OCR识别扫描件 D:\scan\纸质资料.pdf
# 加密文档 & 批量任务
解密PDF D:\doc\保密文件.pdf 123456
批量提取 D:\pdf\合集文件夹
七、典型应用场景
场景 1:财经研报 / 财报解析(对接赚钱计划)
- 提取券商研报、上市公司 PDF 财报中的文字与财务表格
- 结构化数据同步至 AkShare / Stock Market Pro 做量化分析
- 核心观点与数据存入 Agent Memory,关键时间写入 CalDAV
场景 2:研究资料处理(对接 Deep Research Pro)
- 批量解析文献、行业白皮书 PDF
- 提取正文与要点,直接作为研究内容素材
- 重点内容一键导入 PPT 生成汇报页面
场景 3:办公文档整理
解析合同、手册、档案类 PDF,清洗格式后归档,配合桌面自动化完成文件整理。
八、二次开发拓展方向
- 智能章节拆分:自动识别标题、章节,按目录拆分独立文档
- 图文分离导出:单独批量提取 PDF 内所有图片并分类保存
- 多语言 OCR:拓展英文、繁体等多语种文字识别
- 在线 PDF 支持:配合爬虫,直接解析网络在线 PDF 链接
- 内容摘要:结合 AI,提取 PDF 核心要点、自动生成摘要