Замена текста в 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}`);
});