Вот потенциальное решение вашей проблемы, я проверил, и оно работает для меня.Он заменит строку first на «XXXX ...».
Основная проблема с вашим существующим кодом заключалась в том, что он создавал корневой каталог «extract_doc» в файле .zip, который содержит архив документов.Это не то, что ожидает Слово.Ожидается структура документа в корне архива.
Я создал функцию zipDirectory, чтобы обойти это.Основной целью здесь является сохранение структуры каталогов архива.
const archiver = require("archiver");
const fs = require("fs");
fs.readFile('./extracted_doc/word/document.xml', 'utf8', (err, data) => {
if (err) reject(err);
var name = data.indexOf('<w:t>');
var end = data.indexOf('<\/w:t>');
var result = data.replace(data.slice(name + 5, end), "XXXXXXXXXXXXXXXXXX")
fs.writeFile('./extracted_doc/word/document.xml', result, (err) => {
if (err) reject(err);
zipDirectory('./extracted_doc/', './anonymized_submission.docx');
})
});
function zipDirectory(inputDir, outputFile) {
let archive = archiver('zip');
archive.on('error', function (err) {
throw err;
})
let output = fs.createWriteStream(outputFile);
archive.pipe(output);
/* Ok, so we don't want a root name of <input_dir>, this is our workaround. */
archive.directory(inputDir, '../');
archive.finalize();
}