|
|
4 달 전 | |
|---|---|---|
| .. | ||
| README.md | 4 달 전 | |
| constants.ts | 4 달 전 | |
| pdf-providers.ts | 4 달 전 | |
| types.ts | 4 달 전 | |
提供统一接口支持多种 PDF 解析提供商。
# Docker 部署(推荐)
docker pull opendatalab/mineru:latest
docker run -d --name mineru -p 8080:8080 opendatalab/mineru:latest
# 验证
curl http://localhost:8080/api/health
const formData = new FormData();
formData.append('pdf', pdfFile);
formData.append('providerId', 'unpdf');
const response = await fetch('/api/parse-pdf', {
method: 'POST',
body: formData,
});
const result = await response.json();
// result.data: ParsedPdfContent
const formData = new FormData();
formData.append('pdf', pdfFile);
formData.append('providerId', 'mineru');
formData.append('baseUrl', 'http://localhost:8080');
const response = await fetch('/api/parse-pdf', {
method: 'POST',
body: formData,
});
const result = await response.json();
// result.data: ParsedPdfContent with imageMapping
interface ParsedPdfContent {
text: string; // 提取的文本(MinerU 为 Markdown)
images: string[]; // Base64 图片数组
// 扩展特性(MinerU)
tables?: Array<{
page: number;
data: string[][];
caption?: string;
}>;
formulas?: Array<{
page: number;
latex: string;
position?: { x: number; y: number; width: number; height: number };
}>;
layout?: Array<{
page: number;
type: 'title' | 'text' | 'image' | 'table' | 'formula';
content: string;
position?: { x: number; y: number; width: number; height: number };
}>;
metadata?: {
pageCount: number;
parser: 'unpdf' | 'mineru';
fileName?: string;
fileSize?: number;
processingTime?: number;
// 用于内容生成流程(MinerU)
imageMapping?: Record<string, string>; // img_1 -> base64 URL
pdfImages?: Array<{
id: string; // img_1, img_2, etc.
src: string; // base64 data URL
pageNumber: number; // PDF 页码
description?: string; // 图片描述
}>;
};
}
MinerU 解析器与内容生成流程无缝集成:
// 1. 解析 PDF
const parseResult = await parsePDF(
{
providerId: 'mineru',
baseUrl: 'http://localhost:8080',
},
buffer,
);
// 2. 提取数据
const pdfText = parseResult.text; // Markdown(含 img_1 引用)
const pdfImages = parseResult.metadata.pdfImages; // 图片数组
const imageMapping = parseResult.metadata.imageMapping; // 图片映射
// 3. 生成场景大纲
await generateSceneOutlinesFromRequirements(
requirements,
pdfText, // Markdown 内容
pdfImages, // 带页码的图片
aiCall,
);
// 4. 生成场景(含图片)
await buildSceneFromOutline(
outline,
aiCall,
stageId,
assignedImages, // 从 pdfImages 筛选
imageMapping, // 用于解析 img_1 到实际 URL
);
MinerU 的图片处理:
 → { "img_1": "data:image/png;base64,..." }img_1 引用生成幻灯片resolveImageIds() 替换为实际 URLimport { useSettingsStore } from '@/lib/store/settings';
useSettingsStore.setState({
pdfProviderId: 'mineru',
pdfProvidersConfig: {
mineru: {
baseUrl: 'http://localhost:8080',
apiKey: 'optional-if-needed',
},
},
});
// 在 API 调用时覆盖全局设置
formData.append('providerId', 'mineru');
formData.append('baseUrl', 'http://your-server:8080');
formData.append('apiKey', 'optional');
lib/pdf/constants.ts:
export const PDF_PROVIDERS = {
myProvider: {
id: 'myProvider',
name: 'My Provider',
requiresApiKey: true,
features: ['text', 'images'],
},
};
lib/pdf/pdf-providers.ts:
async function parseWithMyProvider(
config: PDFParserConfig,
pdfBuffer: Buffer
): Promise<ParsedPdfContent> {
// 实现解析逻辑
return {
text: '...',
images: [...],
metadata: {
pageCount: 0,
parser: 'myProvider',
},
};
}
switch (config.providerId) {
case 'unpdf':
result = await parseWithUnpdf(pdfBuffer);
break;
case 'mineru':
result = await parseWithMinerU(config, pdfBuffer);
break;
case 'myProvider':
result = await parseWithMyProvider(config, pdfBuffer);
break;
}
访问 http://localhost:3000/debug/pdf-parser 测试解析功能:
A: 检查:
# 服务状态
docker ps | grep mineru
# 网络连通性
curl http://localhost:8080/api/health
# 日志
docker logs mineru
A: 确保:
imageMapping 正确传递到 scene-stream APIA: 优化:
# 增加 Docker 资源
docker run -d \
--name mineru \
-p 8080:8080 \
--memory=4g \
--cpus=2 \
opendatalab/mineru:latest
A: 选择建议:
| 场景 | 推荐 |
|---|---|
| 简单 PDF(纯文本) | unpdf |
| 包含表格、公式 | MinerU |
| 需要保留布局 | MinerU |
| 快速测试 | unpdf |
| 生产环境 | MinerU |
| 无法部署服务 | unpdf |
const files = [file1, file2, file3];
const results = await Promise.all(
files.map((file) => {
const formData = new FormData();
formData.append('pdf', file);
formData.append('providerId', 'mineru');
return fetch('/api/parse-pdf', {
method: 'POST',
body: formData,
}).then((r) => r.json());
}),
);
// 考虑缓存解析结果
const cacheKey = `pdf_${fileHash}`;
const cached = localStorage.getItem(cacheKey);
if (cached) {
return JSON.parse(cached);
}
/MINERU_QUICKSTART.md/MINERU_LOCAL_DEPLOYMENT.md最后更新: 2026-02-11 模式: 本地自托管 状态: 生产就绪