Замена текста в pdf файле

Нужно сделать простую веб форму куда будут загружать pdf файл, разные они могут быть с картинками с и т.д. я хочу чтобы в нём менялись(на месте одного слова было другое) эти слова могут быть раскиданы по разным частям pdf файла, и этот пдф без изменений можно было обратно скачать после редактирования.Уже пробывал через разные библиотеки и я могу записать текст но удалить сатрый и на его место новый текст, функционал библиотек не позволяет, сейчас пробую через hummus вот код html странички

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Загрузка PDF</title>
</head>
<body>
    <h1>Загрузка PDF</h1>
    <form id="uploadForm" enctype="multipart/form-data">
        <input type="file" name="pdfFile" accept=".pdf" required>
        <button type="submit">Загрузить PDF</button>
    </form>

    <script>
        document.getElementById('uploadForm').addEventListener('submit', async (event) => {
            event.preventDefault();

            const formData = new FormData(event.target);

            try {
                const response = await fetch('/upload-pdf', {
                    method: 'POST',
                    body: formData
                });

                if (!response.ok) {
                    throw new Error('Ошибка при отправке файла: ' + response.statusText);
                }

                const result = await response.json();
                alert(result.message);
            } catch (error) {
                console.error('Ошибка:', error);
                alert('Ошибка при отправке файла: ' + error.message);
            }
        });
    </script>
</body>
</html>

и код сервера

const express = require('express');
const app = express();
const port = 3000;
const path = require('path'); // Добавляем импорт модуля path
const hummus = require('hummus'); // Импортируем HummusJS
// Маршрут для отображения HTML-страницы
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'index.html')); // Отправляем HTML-файл при GET запросе к корневому маршруту
});


/*---------------------------------------------------------------------------------------------------------------------------------------------------------------*/
//Работа с PDF
const fs = require('fs');
const { PDFDocument, rgb } = require('pdf-lib'); // Импорт библиотеки pdf lib
const pdfParse = require('pdf-parse');

const multer = require('multer');
//Загрузка PDF

// Настройка Multer для загрузки файлов
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, 'uploads/'); // Убедитесь, что эта папка существует
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname); // Сохраняем файл с оригинальным именем
    }
});

const upload = multer({ storage: storage });

async function modifyExistingPDF(sourceFilePath, findText, replaceText) {
    // Проверка наличия исходного файла
    if (!fs.existsSync(sourceFilePath)) {
        throw new Error(`Source file ${sourceFilePath} does not exist.`);
    }

    // Создание писателя для модификации PDF
    const modPdfWriter = hummus.createWriterToModify(sourceFilePath, { modifiedFilePath: './output.pdf', compress: false });

    // Получение контекста копирования
    const sourceParser = modPdfWriter.createPDFCopyingContextForModifiedFile().getSourceDocumentParser();

    // Чтение первой страницы
    const pageObject = sourceParser.parsePage(0);
    
    // Получение потока содержимого
    const contentsStream = sourceParser.queryDictionaryObject(pageObject.getDictionary(), 'Contents');

    // Проверка на наличие потока содержимого
    if (!contentsStream) {
        throw new Error('Contents stream not found');
    }

    // Чтение оригинального блока данных текста
    const data = [];
    const readStream = sourceParser.startReadingFromStream(contentsStream);
    
    while (readStream.notEnded()) {
        const readData = readStream.read(10000);
        data.push(...readData);
    }

    // Создание новой строки
    let string = Buffer.from(data).toString('utf-8');

    // Логируем оригинальную строку
    console.log('Original String:', string);

    // Заменяем текст
    if (string.includes(findText)) {
        string = string.replace(new RegExp(findText, 'g'), replaceText);
    } else {
        throw new Error(`Text "${findText}" not found in PDF.`);
    }

    // Создаем и записываем новый объект текста
    const objectsContext = modPdfWriter.getObjectsContext();
    const textObjectID = pageObject.getDictionary().toJSObject().Contents.getObjectID();

    // Проверяем, действительно ли это объект, который мы хотим модифицировать
    if (typeof textObjectID !== 'number') {
        throw new Error('Invalid text object ID.');
    }

    objectsContext.startModifiedIndirectObject(textObjectID);

    // Создаем поток и записываем данные
    const stream = objectsContext.startUnfilteredPDFStream();
    stream.getWriteStream().write(Buffer.from(string, 'utf-8'));
    objectsContext.endPDFStream(stream);
    objectsContext.endIndirectObject();

    // Завершаем запись PDF
    modPdfWriter.end();

    // Удаляем старые объекты, которые больше не используются
    hummus.recrypt('./output.pdf', './outputClean.pdf');
}

app.post('/upload-pdf', upload.single('pdfFile'), async (req, res) => {
    console.log('Файл загружается на сервер...');

    if (!req.file) {
        return res.status(400).json({ error: 'Файл не загружен' });
    }

    const sourceFilePath = req.file.path; // Путь к загруженному файлу
    const findText = 'Слово'; // Текст для поиска (вы можете это изменить)
    const replaceText = 'Буква'; // Текст для замены

    try {
        await modifyExistingPDF(sourceFilePath, findText, replaceText); // Обрабатываем PDF
        res.json({ message: 'PDF обработан успешно!' });
    } catch (error) {
        console.error('Ошибка при обработке PDF:', error);
        res.status(500).json({ error: 'Ошибка при обработке PDF' });
    }
});


/*---------------------------------------------------------------------------------------------------------------------------------------------------------------*/


// Запуск сервера
app.listen(port, () => {
    console.log(`Server is running at http://localhost:${port}`);
});


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