4NK_IA_front/backend/pdfConverter.js

116 lines
3.4 KiB
JavaScript

/**
* Module de conversion PDF vers images pour l'OCR
*/
const pdf = require('pdf-poppler')
const fs = require('fs')
const path = require('path')
/**
* Convertit un PDF en images pour l'OCR
* @param {string} pdfPath - Chemin vers le fichier PDF
* @param {string} outputDir - Répertoire de sortie (optionnel)
* @returns {Promise<Array>} - Tableau des chemins des images générées
*/
async function convertPdfToImages(pdfPath, outputDir = null) {
console.log(`[PDF-CONVERTER] Début de la conversion PDF: ${path.basename(pdfPath)}`)
try {
// Répertoire de sortie par défaut
if (!outputDir) {
outputDir = path.dirname(pdfPath)
}
// Configuration de la conversion
const options = {
format: 'png',
out_dir: outputDir,
out_prefix: 'page',
page: null, // Toutes les pages
scale: 2000, // Résolution élevée
}
console.log(`[PDF-CONVERTER] Configuration: Format=PNG, Scale=2000`)
// Conversion de toutes les pages
const results = await pdf.convert(pdfPath, options)
console.log(`[PDF-CONVERTER] Conversion terminée: ${results.length} page(s) convertie(s)`)
// Retourner les chemins des images générées
const imagePaths = results.map((result, index) => {
const imagePath = path.join(outputDir, `page-${index + 1}.png`)
console.log(`[PDF-CONVERTER] Page ${index + 1}: ${imagePath}`)
return imagePath
})
return imagePaths
} catch (error) {
console.error(`[PDF-CONVERTER] Erreur lors de la conversion:`, error.message)
throw error
}
}
/**
* Convertit un PDF en une seule image (première page)
* @param {string} pdfPath - Chemin vers le fichier PDF
* @param {string} outputPath - Chemin de sortie de l'image (optionnel)
* @returns {Promise<string>} - Chemin de l'image générée
*/
async function convertPdfToSingleImage(pdfPath, outputPath = null) {
console.log(`[PDF-CONVERTER] Conversion PDF vers image unique: ${path.basename(pdfPath)}`)
try {
// Chemin de sortie par défaut
if (!outputPath) {
const baseName = path.basename(pdfPath, '.pdf')
const dirName = path.dirname(pdfPath)
outputPath = path.join(dirName, `${baseName}_converted.png`)
}
// Configuration pour une seule page
const options = {
format: 'png',
out_dir: path.dirname(outputPath),
out_prefix: path.basename(outputPath, '.png'),
page: 1, // Première page seulement
scale: 2000,
}
// Conversion de la première page seulement
const results = await pdf.convert(pdfPath, options)
console.log(`[PDF-CONVERTER] Image générée: ${outputPath}`)
return outputPath
} catch (error) {
console.error(`[PDF-CONVERTER] Erreur lors de la conversion:`, error.message)
throw error
}
}
/**
* Nettoie les fichiers temporaires générés
* @param {Array} filePaths - Chemins des fichiers à supprimer
*/
async function cleanupTempFiles(filePaths) {
console.log(`[PDF-CONVERTER] Nettoyage de ${filePaths.length} fichier(s) temporaire(s)`)
for (const filePath of filePaths) {
try {
if (fs.existsSync(filePath)) {
await fs.promises.unlink(filePath)
console.log(`[PDF-CONVERTER] Fichier supprimé: ${path.basename(filePath)}`)
}
} catch (error) {
console.warn(`[PDF-CONVERTER] Erreur lors de la suppression de ${filePath}: ${error.message}`)
}
}
}
module.exports = {
convertPdfToImages,
convertPdfToSingleImage,
cleanupTempFiles,
}