52 lines
1.9 KiB
JavaScript
52 lines
1.9 KiB
JavaScript
/**
|
|
* API Route: 解析 DOC / PDF 文件为纯文本
|
|
* POST /api/parse-file
|
|
* Body: FormData { file: File }
|
|
* Response: { text: string } | { error: string }
|
|
*/
|
|
|
|
import { NextResponse } from 'next/server';
|
|
|
|
export async function POST(request) {
|
|
try {
|
|
const formData = await request.formData();
|
|
const file = formData.get('file');
|
|
|
|
if (!file || typeof file === 'string') {
|
|
return NextResponse.json({ error: '未提供文件' }, { status: 400 });
|
|
}
|
|
|
|
const fileName = file.name.toLowerCase();
|
|
const buffer = Buffer.from(await file.arrayBuffer());
|
|
|
|
let text = '';
|
|
|
|
if (fileName.endsWith('.pdf')) {
|
|
// PDF 解析 — 直接引用内部模块,避免 index.js 加载测试文件
|
|
const pdfParse = (await import('pdf-parse/lib/pdf-parse.js')).default;
|
|
const pdfData = await pdfParse(buffer);
|
|
console.log('[parse-file] PDF pages:', pdfData.numpages, 'text length:', (pdfData.text || '').length);
|
|
text = pdfData.text || '';
|
|
} else if (fileName.endsWith('.doc') && !fileName.endsWith('.docx')) {
|
|
// DOC 解析(旧版 Word 二进制格式)
|
|
const WordExtractor = (await import('word-extractor')).default;
|
|
const extractor = new WordExtractor();
|
|
const doc = await extractor.extract(buffer);
|
|
text = doc.getBody() || '';
|
|
} else {
|
|
return NextResponse.json({ error: '不支持的文件格式' }, { status: 400 });
|
|
}
|
|
|
|
if (!text.trim()) {
|
|
return NextResponse.json({ text: '', warning: '文件中未能提取到文本内容(可能是扫描件或图片PDF)' });
|
|
}
|
|
return NextResponse.json({ text });
|
|
} catch (err) {
|
|
console.error('parse-file error:', err);
|
|
return NextResponse.json(
|
|
{ error: `解析失败:${err.message}` },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|