неправильно выводятся данные из пдф в таблицу (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;

Ответы (0 шт):