неправильно выводятся данные из пдф в таблицу (React)
import React, { useState } from "react";
import "../../styles/uploadPDF.css";
import * as pdfjsLib from "pdfjs-dist";
import * as XLSX from "xlsx";
pdfjsLib.GlobalWorkerOptions.workerSrc = "/pdf.worker.js";
const UploadPDF = () => {
const [pdfFiles, setPdfFiles] = useState([]);
const handleFileUpload = (event) => {
const files = Array.from(event.target.files);
setPdfFiles(files);
processPdfFiles(files);
};
const processPdfFiles = async (files) => {
const parsedData = [];
for (const file of files) {
try {
const pdfData = await file.arrayBuffer();
const text = await extractTextFromPDF(pdfData);
const rows = parsePdfData(text);
parsedData.push(...rows);
} catch (error) {
console.error(`Ошибка обработки файла ${file.name}:`, error);
}
}
exportToExcel(parsedData, "Medical_Analysis");
};
const extractTextFromPDF = async (pdfData) => {
const pdfDoc = await pdfjsLib.getDocument({ data: pdfData }).promise;
let fullText = "";
for (let i = 0; i < pdfDoc.numPages; i++) {
const page = await pdfDoc.getPage(i + 1);
const textContent = await page.getTextContent();
const pageText = textContent.items
.map((item) => item.str)
.join(" ");
fullText += pageText + "\n";
}
return fullText;
};
const parsePdfData = (text) => {
const cleanText = text
.replace(/\s+/g, " ")
.replace(/\n+/g, "\n")
.trim();
const lines = cleanText.split("\n");
const regex = /^(.*?)(\d+(\.\d+)?)(\s*(сек|г\/л|%|ммоль\/л|мг\/л|ед\/л|ед\/мл)?)?\s+(\d.*?[-–].*)?$/;
const data = [];
lines.forEach((line) => {
const match = line.match(regex);
if (match) {
const name = match[1]?.trim() || "Нет названия";
const result = match[2]?.trim() || "Нет значения";
const unit = match[5]?.trim() || "";
const reference = match[6]?.trim() || "Нет референса";
data.push({
"Название показателя": name,
"Значение": result,
"Единица измерения": unit,
"Референс": reference,
});
}
});
return data;
};
const exportToExcel = (data, fileName) => {
const ws = XLSX.utils.json_to_sheet(data, {
header: ["Название показателя", "Значение", "Единица измерения", "Референс"],
});
const wsCols = [
{ wch: 30 },
{ wch: 15 },
{ wch: 20 },
{ wch: 30 },
];
ws["!cols"] = wsCols;
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Анализы");
XLSX.writeFile(wb, `${fileName}.xlsx`);
};
return (
<div className="pdf-upload-container">
<h2>Загрузка PDF файлов</h2>
<input
type="file"
multiple
accept=".pdf"
onChange={handleFileUpload}
className="pdf-upload-input"
/>
</div>
);
};
export default UploadPDF;
import * as XLSX from "xlsx";
const exportToExcel = (data, fileName) => {
const ws = XLSX.utils.json_to_sheet(data);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
XLSX.writeFile(wb, `${fileName}.xlsx`);
};
export default exportToExcel;
Есть вот эти 2 кода, код UploadPDF подразумевает то что вы можете загрузить PDF файл в инпут который находится в компоненте Dashboard (он косвенно играет роль в этой ситуации но все равно вставлю его), и при вставке PDF, используя библиотеку pdfjs, я извлекаю текстовые данные из документа,дата вытаскивается из пдф файла в заголовке: дата сдачи анализа (в консоли весь текст PDF документа извлечен корректно я тестил), и фильтрую извлеченный текст (отдельно выделю эту функцию),
const parsePdfData = (text) => {
const cleanText = text
.replace(/\s+/g, " ")
.replace(/\n+/g, "\n")
.trim();
const lines = cleanText.split("\n");
const regex = /^(.*?)(\d+(\.\d+)?)(\s*(сек|г\/л|%|ммоль\/л|мг\/л|ед\/л|ед\/мл)?)?\s+(\d.*?[-–].*)?$/;
const data = [];
lines.forEach((line) => {
const match = line.match(regex);
if (match) {
const name = match[1]?.trim() || "Нет названия";
const result = match[2]?.trim() || "Нет значения";
const unit = match[5]?.trim() || "";
const reference = match[6]?.trim() || "Нет референса";
data.push({
"Название показателя": name,
"Значение": result,
"Единица измерения": unit,
"Референс": reference,
});
}
});
return data;
};
далее автоматически качается документ excell medical_analysis.xlsx, но вместо адекватной таблицы (вот как она должна выглядеть по итогу)
Исследование | Результат | Единицы | Референсные значения |
---|---|---|---|
Протромбированное время | 10.4 | cек | 10-13.2 |
Протромбин (по квику) | 106 | % | 80-133 |
МНО | 0.94 | ||
АЧТВ | 26.5 | сек | 25.4-36.9 |
Фибронген | 2.8 | г/л | 2-4 |
Тромбированое время | 14.0 | сек | 10.3-16.6 |
Сам PDF файл, и что выходит на итоге по моей конвертации
Я получаю просто лютую кашу вперемешку. Я пытался починить все при помощи чата гпт, сотни раз переделывал const regex = /^(.?)(\d+(.\d+)?)(\s(сек|г/л|%|ммоль/л|мг/л|ед/л|ед/мл)?)?\s+(\d.?[-–].)?$/; Убирал лишние пробелы и тд, не помогло, надеюсь на вашу помощь
import React from "react";
import UploadPDF from "../utils/UploadPDF";
import "../../styles/dashboard.css";
function Dashboard() {
return (
<div className="dashboard-container">
<header className="dashboard-header">
<h1>Добро пожаловать в систему!</h1>
<p>Загрузите свои медицинские анализы и получите таблицу Excel.</p>
</header>
<main className="dashboard-main">
<section className="upload-section">
<h2>Загрузка файлов</h2>
<p>Выберите файлы в формате PDF для обработки:</p>
<UploadPDF />
</section>
<section className="history-section">
<h2>История загрузок</h2>
<p>Здесь будут отображаться обработанные файлы.</p>
<div className="history-placeholder">
<p>История пока пуста.</p>
</div>
</section>
</main>
</div>
);
}
export default Dashboard;