import { promises as fs } from 'fs';
import { v4 as uuidv4 } from 'uuid';
import PDFParser from 'pdf2json';
import { NextRequest, NextResponse } from 'next/server';
import path from 'path';
export async function POST(req: NextRequest) {
const formData: FormData = await req.formData();
const uploadedFiles = formData.getAll('file');
let fileName = '';
let parsedText = '';
if (uploadedFiles && uploadedFiles.length > 0) {
const uploadedFile = uploadedFiles[0];
// Check if uploadedFile is of type File
if (uploadedFile instanceof File) {
// Generate a unique filename
fileName = `${uuidv4()}.pdf`;
// Convert the uploaded file into a temporary file
const filePath = path.join(process.cwd(), 'data', fileName);
try {
// Convert ArrayBuffer to Buffer
const fileBuffer = Buffer.from(await uploadedFile.arrayBuffer());
// Save the buffer as a file
await fs.writeFile(filePath, fileBuffer);
// Initialize PDF parser
const pdfParser = new (PDFParser as any)(null, 1);
// Define event handlers
pdfParser.on('pdfParser_dataError', (errData: any) =>
console.error('PDF parsing error:', errData.parserError)
);
// Use a promise to handle the parsing completion
await new Promise<void>((resolve, reject) => {
pdfParser.on('pdfParser_dataReady', () => {
parsedText = pdfParser.getRawTextContent();
resolve();
});
pdfParser.on('pdfParser_dataError', reject);
pdfParser.loadPDF(filePath);
});
} catch (error) {
console.error('Error processing file:', error);
return new NextResponse(
JSON.stringify({ success: false, error: 'Error processing file' }),
{ status: 500 }
);
}
} else {
return new NextResponse(
JSON.stringify({ success: false, error: 'Uploaded file is not in the expected format' }),
{ status: 400 }
);
}
} else {
return new NextResponse(
JSON.stringify({ success: false, error: 'No files found' }),
{ status: 400 }
);
}
const response = new NextResponse(
JSON.stringify({ success: true, parsedText })
);
response.headers.set('Content-Type', 'application/json');
response.headers.set('FileName', fileName);
return response;
}