99 lines
3.2 KiB
JavaScript
99 lines
3.2 KiB
JavaScript
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 });
|
|
}
|
|
}
|