Files
YG-Datasets/easy-dataset-main/app/api/projects/[projectId]/images/pdf-convert/route.js

99 lines
3.2 KiB
JavaScript
Raw Normal View History

2026-03-17 14:36:31 +08:00
import { NextResponse } from 'next/server';
import { getProjectPath } from '@/lib/db/base';
import { importImagesFromDirectories } from '@/lib/services/images';
import fs from 'fs/promises';
import path from 'path';
import { savePdfAsImages } from '@/lib/util/file';
// PDF 转图片并导入
export async function POST(request, { params }) {
let tempPdfPath = null;
let tempImagesDir = null;
try {
const { projectId } = params;
const formData = await request.formData();
const pdfFile = formData.get('file');
if (!pdfFile) {
return NextResponse.json({ error: '请选择 PDF 文件' }, { status: 400 });
}
if (!pdfFile.name.toLowerCase().endsWith('.pdf')) {
return NextResponse.json({ error: '只支持 PDF 文件' }, { status: 400 });
}
const projectPath = await getProjectPath(projectId);
const tempDir = path.join(projectPath, 'temp');
await fs.mkdir(tempDir, { recursive: true });
// 1. 保存 PDF 到临时目录
tempPdfPath = path.join(tempDir, `temp_${Date.now()}_${pdfFile.name}`);
const pdfBuffer = Buffer.from(await pdfFile.arrayBuffer());
await fs.writeFile(tempPdfPath, pdfBuffer);
// 2. 创建临时图片目录
tempImagesDir = path.join(tempDir, `pdf_images_${Date.now()}`);
await fs.mkdir(tempImagesDir, { recursive: true });
// 3. 调用 pdf2md-js 转换 PDF 为图片
console.log('开始转换 PDF 为图片...');
const imagePaths = await savePdfAsImages(tempPdfPath, tempImagesDir, 3);
console.log('PDF 转换完成,生成图片数量:', imagePaths.length);
if (!imagePaths || imagePaths.length === 0) {
throw new Error('PDF 转换失败,未生成图片');
}
// 4. 直接调用服务层导入图片
const importResult = await importImagesFromDirectories(projectId, [tempImagesDir]);
// 5. 清理临时文件
try {
if (tempPdfPath) {
await fs.unlink(tempPdfPath);
}
if (tempImagesDir) {
const tempImages = await fs.readdir(tempImagesDir);
for (const img of tempImages) {
await fs.unlink(path.join(tempImagesDir, img));
}
await fs.rmdir(tempImagesDir);
}
const tempDirContents = await fs.readdir(tempDir);
if (tempDirContents.length === 0) {
await fs.rmdir(tempDir);
}
} catch (cleanupErr) {
console.warn('清理临时文件失败:', cleanupErr);
}
return NextResponse.json({
success: true,
count: importResult.count,
images: importResult.images,
pdfName: pdfFile.name
});
} catch (error) {
console.error('Failed to convert PDF:', error);
// 清理临时文件
try {
if (tempPdfPath) {
await fs.unlink(tempPdfPath).catch(() => {});
}
if (tempImagesDir) {
const tempImages = await fs.readdir(tempImagesDir).catch(() => []);
for (const img of tempImages) {
await fs.unlink(path.join(tempImagesDir, img)).catch(() => {});
}
await fs.rmdir(tempImagesDir).catch(() => {});
}
} catch (cleanupErr) {
console.warn('清理临时文件失败:', cleanupErr);
}
return NextResponse.json({ error: error.message || 'Failed to convert PDF' }, { status: 500 });
}
}