chore : changement de biblioteque pour un meilleurs parse, PDF.js #5
This commit is contained in:
@@ -1,23 +1,15 @@
|
||||
const fs = require('fs');
|
||||
const pdfParse = require('pdf-parse-fork');
|
||||
import * as fs from 'fs';
|
||||
const pdfjsLib = require('pdfjs-dist');
|
||||
|
||||
function pdf_parse(travel: string){
|
||||
interface PdfData {
|
||||
text: string;
|
||||
}
|
||||
|
||||
let fournisseur = '';
|
||||
let date = '';
|
||||
|
||||
async function pdfParse(travel: string) {
|
||||
interface DetailProduit {
|
||||
quantité: number;
|
||||
prixHT: number;
|
||||
TVA: string;
|
||||
}
|
||||
|
||||
const productsList: { [key: string]: DetailProduit } = {};
|
||||
|
||||
interface tab_res {
|
||||
interface res {
|
||||
marque: string;
|
||||
date_achats: string;
|
||||
products: {
|
||||
@@ -25,78 +17,117 @@ function pdf_parse(travel: string){
|
||||
};
|
||||
}
|
||||
|
||||
const productsList: { [key: string]: DetailProduit } = {};
|
||||
let fournisseur = '';
|
||||
let date = '';
|
||||
|
||||
const dataBuffer = fs.readFileSync(travel);
|
||||
const cheminPDF = travel;
|
||||
|
||||
pdfParse(dataBuffer)
|
||||
.then((data: PdfData) => {
|
||||
// on regarde si c'est auchan ou metro
|
||||
const regexAuchan = /auchan/i;
|
||||
if (regexAuchan.test(data.text)) {
|
||||
fournisseur = "Auchan"
|
||||
|
||||
// on regarde la date d'achat avec une expression reguliere pour auchan
|
||||
const regexDate = /(\d{2})\/(\d{2})\/(\d{4})/;
|
||||
const correspondance = data.text.match(regexDate);
|
||||
if (correspondance) {
|
||||
date = correspondance[0]
|
||||
} else {
|
||||
date = "non trouvé"
|
||||
}
|
||||
try {
|
||||
// Lecture du fichier binaire du PDF et conversion pour PDF.js
|
||||
const dataBuffer = new Uint8Array(fs.readFileSync(cheminPDF));
|
||||
|
||||
// on prend la liste des produits et leurs detail pour auchan
|
||||
const lignes = data.text.split('\n');
|
||||
// Chargement du document par PDF.js
|
||||
const loadingTask = pdfjsLib.getDocument({ data: dataBuffer });
|
||||
const pdf = await loadingTask.promise;
|
||||
|
||||
let texte = '';
|
||||
|
||||
// Boucle pour extraire le texte de chaque page du PDF
|
||||
for (let i = 1; i <= pdf.numPages; i++) {
|
||||
const page = await pdf.getPage(i);
|
||||
const textContent = await page.getTextContent();
|
||||
|
||||
// Expressions régulières pour détecter les lignes de produits Auchan
|
||||
const regexLigneProduit = /^(\d{13})(?!\d)(.+?)(\d+,\d+)\s+(\d+)\s+(\d+,\d+)\s+(\d+,\d+)\s+(\d+,\d+)$/;
|
||||
// On récupère chaque fragment de texte trouvé graphiquement sur la page et on les sépare par un saut de ligne
|
||||
const textePage = textContent.items.map((item: any) => item.str).join('\n');
|
||||
texte += textePage + '\n';
|
||||
}
|
||||
|
||||
const regexAuchan = /auchan/i.test(texte);
|
||||
|
||||
lignes.forEach((ligne: string) => {
|
||||
const match = ligne.trim().match(regexLigneProduit);
|
||||
|
||||
if (match) {
|
||||
const nomProduit = match[1].trim();
|
||||
const quantite = parseInt(match[4], 10);
|
||||
const prixHT = parseFloat(match[2].replace(',', '.'));
|
||||
const tva = match[6].replace(',', '.') + "%";
|
||||
|
||||
productsList[nomProduit] = {
|
||||
quantité: quantite,
|
||||
prixHT: prixHT,
|
||||
TVA: tva
|
||||
};
|
||||
}
|
||||
});
|
||||
// on regarde si c'est auchan ou metro
|
||||
|
||||
if (regexAuchan) {
|
||||
fournisseur = "Auchan";
|
||||
|
||||
// on regarde la date d'achat avec une expression reguliere pour auchan
|
||||
const regexDate = /(\d{2})\/(\d{2})\/(\d{4})/;
|
||||
const correspondance = texte.match(regexDate);
|
||||
if (correspondance) {
|
||||
date = correspondance[0]
|
||||
} else {
|
||||
fournisseur = "Metro"
|
||||
date = "non trouvé"
|
||||
}
|
||||
|
||||
// on regarde la date d'achat avec une expression reguliere pour metro
|
||||
const regexDate = /(\d{2})-(\d{2})-(\d{4})/;
|
||||
const correspondance = data.text.match(regexDate);
|
||||
if (correspondance) {
|
||||
date = correspondance[0]
|
||||
} else {
|
||||
date = "non trouvé"
|
||||
// Découpage en lignes pour l'analyse
|
||||
const lignes = texte.split('\n').map(l => l.trim()).filter(l => l.length > 0);
|
||||
|
||||
// Algorithme de recherche verticale pour Auchan
|
||||
for (let i = 0; i < lignes.length; i++) {
|
||||
// Si la ligne correspond exactement à un code-barres à 13 chiffres
|
||||
if (/^\d{13}$/.test(lignes[i])) {
|
||||
const nomProduit = lignes[i + 1];
|
||||
|
||||
let idxQuantite = i + 3;
|
||||
let idxPrixHT = i + 4;
|
||||
let idxTva = i + 5;
|
||||
|
||||
// Gestion de la ligne parasite Eco-participation qui décale le tableau
|
||||
if (lignes[i + 2] && lignes[i + 2].includes("Eco-participation")) {
|
||||
idxQuantite += 2;
|
||||
idxPrixHT += 2;
|
||||
idxTva += 2;
|
||||
}
|
||||
|
||||
const qte = lignes[idxQuantite];
|
||||
const prix = lignes[idxPrixHT];
|
||||
const tva = lignes[idxTva];
|
||||
let tvaFinal: string;
|
||||
|
||||
if (tva) {
|
||||
tvaFinal = tva.replace(',', '.').trim() + "%";
|
||||
} else {
|
||||
tvaFinal = "non trouvé";
|
||||
}
|
||||
|
||||
|
||||
productsList[nomProduit] = {
|
||||
quantité: parseInt(qte, 10),
|
||||
prixHT: parseFloat(prix.replace(',', '.')),
|
||||
TVA: tvaFinal
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// on renvoie les valeur avec un seul objet
|
||||
|
||||
const res : tab_res = {
|
||||
marque: fournisseur,
|
||||
date_achats: date,
|
||||
products: productsList
|
||||
} else {
|
||||
fournisseur = "Metro";
|
||||
|
||||
// on regarde la date d'achat avec une expression reguliere pour metro
|
||||
const regexDate = /(\d{2})-(\d{2})-(\d{4})/;
|
||||
const correspondance = texte.match(regexDate);
|
||||
if (correspondance) {
|
||||
date = correspondance[0]
|
||||
} else {
|
||||
date = "non trouvé"
|
||||
}
|
||||
|
||||
|
||||
console.log(res);
|
||||
}
|
||||
|
||||
})
|
||||
// Construction de l'objet final
|
||||
const resultat: res = {
|
||||
marque: fournisseur,
|
||||
date_achats: date,
|
||||
products: productsList
|
||||
};
|
||||
|
||||
console.log(resultat);
|
||||
|
||||
|
||||
.catch((error: unknown) => {
|
||||
console.error("Erreur :", error);
|
||||
});
|
||||
} catch (e) {
|
||||
console.error("Erreur :", e);
|
||||
}
|
||||
}
|
||||
|
||||
export default pdf_parse;
|
||||
|
||||
export default pdfParse;
|
||||
Reference in New Issue
Block a user