Категория

Защита документов Word с помощью JavaScript: ограничение редактирования

2026-09-30 09:24:12 Allen Yang
AI Summarize:
ChatGPT
ChatGPT ✓
Claude ✓
Grok ✓
Perplexity ✓
Quick
Quick
Concise overview
Highlights
Key takeaways
Detailed
Structured explanation
Brief
One sentence summary
Summarize |

The document after protection with the AllowOnlyReading type

Когда разработчики слышат «защитить документ Word», первое, что часто приходит на ум, — это шифрование: установить пароль, чтобы никто не мог открыть файл. Но существует второй, не менее важный уровень защиты документа: ограничение действий, которые может выполнять читатель после открытия документа. Шаблон договора, отправленный клиенту, должен позволять ему заполнять пропуски, не меняя согласованные условия. Чистовик, разосланный на проверку, должен разрешать комментарии, но блокировать прямое редактирование основного текста. В таких сценариях нужны ограничения редактирования, а не шифрование с паролем на открытие.

Spire.Doc for JavaScript предоставляет эту возможность непосредственно в браузере через WebAssembly. Используя виртуальную файловую систему (VFS) для управления шрифтами и файловыми ресурсами, он обрабатывает документы Word полностью на стороне клиента — без серверной части, без загрузки файлов, без задержек на обмен данными. Метод Protect принимает значение перечисления ProtectionType вместе с паролем и применяет соответствующее ограничение редактирования к документу.

В этой статье рассматриваются пять типов защиты, доступных в Spire.Doc for JavaScript, они сравниваются в одной справочной таблице, а затем демонстрируется, как применить тип защиты ко всему документу и как заблокировать только определённые разделы, оставив остальные редактируемыми.


Защита и шифрование: две разные цели

Прежде чем переходить к типам защиты, стоит чётко разграничить два понятия, которые часто путают:

  • Шифрование (пароль на открытие) определяет, кто может открыть документ. Без пароля содержимое файла недоступно.
  • Ограничения редактирования (тип защиты) определяют, что читатель может изменить после того, как документ уже открыт. Читатель может свободно просматривать содержимое; ограничение определяет, какие действия редактирования доступны.

Ограничения редактирования не препятствуют выделению, копированию или поиску — они блокируют только изменения. Если ваша цель — не дать забрать содержимое, нужно шифрование. Если ваша цель — не дать изменить содержимое, но по-прежнему разрешить его чтение, нужно ограничение редактирования. Эти два механизма дополняют друг друга и могут использоваться вместе, но служат разным целям.


Типы защиты: краткий обзор

Spire.Doc for JavaScript предоставляет пять значений перечисления ProtectionType. Каждое из них определяет свою область редактирования — от полностью открытой до полностью заблокированной. В таблице ниже приведены все пять, чтобы вы могли сразу выбрать подходящее.

ProtectionType Влияние на документ Типичный сценарий использования
NoProtection Ограничения не применяются; доступны все действия редактирования. Снятие существующего ограничения или начало с чистого состояния.
AllowOnlyReading Документ можно просматривать, но нельзя редактировать. Команды редактирования на ленте отключены. Итоговые отчёты, опубликованные уведомления или любые материалы только для чтения.
AllowOnlyComments Читатели могут добавлять комментарии, но не могут изменять основной текст. Циклы проверки, где рецензенты должны оставить отзыв, не изменяя содержимое.
AllowOnlyFormFields Редактировать можно только поля формы; остальная часть документа заблокирована. Договоры, опросы и шаблоны с полями для заполнения.
AllowOnlyRevisions Все правки принимаются как отслеживаемые изменения и могут быть проверены позже. Совместная работа над черновиком, где каждое изменение должно быть видимым и обратимым.

Как выбрать: Если читатель не должен ничего менять, используйте AllowOnlyReading. Если читатель должен заполнять только отведённые пустые поля, используйте AllowOnlyFormFields. Если читатель должен оставить отзыв, не трогая текст, используйте AllowOnlyComments. Если каждое изменение должно отслеживаться для последующей проверки, используйте AllowOnlyRevisions. Если нужно снять ранее применённое ограничение, используйте NoProtection.


Применение типа защиты ко всему документу

Самый простой подход — защитить весь документ одним значением ProtectionType. Рабочий процесс состоит из трёх этапов: загрузить файлы шрифтов и целевой документ Word в виртуальную файловую систему WASM с помощью FetchFileToVFS; создать экземпляр Document, загрузить файл и вызвать Protect с нужным типом защиты и паролем, который позже снимет ограничение; затем сохранить документ, прочитать созданный файл из VFS, обернуть его в Blob и запустить скачивание в браузере.

В приведённом ниже примере используется AllowOnlyReading, но вы можете подставить любое из пяти значений ProtectionType из таблицы выше.

function App() {
  const protectWithSpecifiedType = async () => {
    const docModule = window.wasmModule?.spiredoc;
    if (!docModule) {
      alert('Spire.Doc is not ready yet');
      return;
    }

    const inputFileName = 'Template.docx';
    await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}/data/`);

    // Load the document
    const doc = new docModule.Document();
    doc.LoadFromFile(inputFileName);

    // Protect the document with the "AllowOnlyReading" type; the password lifts the restriction
    doc.Protect({ type: docModule.ProtectionType.AllowOnlyReading, password: "123456" });

    // Define the output file name and save
    const outputFileName = "SpecifiedProtectionType.docx";
    doc.SaveToFile({ fileName: outputFileName, fileFormat: docModule.FileFormat.Docx2013 });
    doc.Dispose();

    const modifiedFileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
    const blob = new Blob([modifiedFileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = outputFileName;
    a.click();
    URL.revokeObjectURL(url);
  };

 return (
    <div style={{ textAlign: 'center', height: '300px' }}>
      <h1>Protect a Document with a Specified Type</h1>
      <button onClick={protectWithSpecifiedType}>Generate</button>
    </div>
  );
}
export default App;

После защиты документа типом AllowOnlyReading его содержимое можно только просматривать, а команды редактирования на ленте ограничены.

The document after protection with the AllowOnlyReading type


Блокировка только указанных разделов

Равномерная защита всего документа хорошо подходит для простых материалов, но многие реальные документы требуют более тонкой настройки. Например, шаблон коммерческого предложения может содержать фиксированные условия, которые должны оставаться заблокированными, наряду с разделом, где клиент вводит свои данные. Spire.Doc for JavaScript решает эту задачу, сочетая защиту всего документа с переопределениями для отдельных разделов.

Стратегия такова: сначала защитить весь документ с помощью AllowOnlyFormFields, затем установить свойство ProtectForm любого раздела, который должен оставаться редактируемым, в false. Это выборочно освобождает отдельные разделы, пока остальная часть документа остаётся заблокированной.

Рабочий процесс состоит из трёх этапов: загрузить файлы шрифтов в виртуальную файловую систему WASM с помощью FetchFileToVFS; создать экземпляр Document, создать разделы с помощью AddSection и записать в них содержимое, вызвать Protect, чтобы заблокировать весь документ только для полей формы, и установить ProtectForm в false для раздела, который нужно освободить; затем сохранить документ, прочитать созданный файл из VFS, обернуть его в Blob и запустить скачивание в браузере.

function App() {
  const lockSpecifiedSections = async () => {
    const docModule = window.wasmModule?.spiredoc;
    if (!docModule) {
      alert('Spire.Doc is not ready yet');
      return;
    }

    // Create a new document and add two sections
    const doc = new docModule.Document();
    let s1 = doc.AddSection();
    let s2 = doc.AddSection();

    // Write content into each of the two sections
    s1.AddParagraph().AppendText("Spire.Doc demo, section 1");
    s2.AddParagraph().AppendText("Spire.Doc demo, section 2");

    // Protect the whole document for form fields only
    doc.Protect({ type: docModule.ProtectionType.AllowOnlyFormFields, password: "123" });

    // Release section 2 on its own so that it can be edited
    s2.ProtectForm = false;

    // Define the output file name and save
    const outputFileName = 'LockSpecifiedSections.docx';
    doc.SaveToFile({ fileName: outputFileName, fileFormat: docModule.FileFormat.Docx2013 });
    doc.Dispose();

    const modifiedFileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
    const blob = new Blob([modifiedFileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = outputFileName;
    a.click();
    URL.revokeObjectURL(url);
  };

 return (
    <div style={{ textAlign: 'center', height: '300px' }}>
      <h1>Lock Specified Sections of a Word Document</h1>
      <button onClick={lockSpecifiedSections}>Generate</button>
    </div>
  );
}
export default App;

После освобождения раздела 2 только раздел 1 сохраняет ограничение редактирования в документе.

The document after only the specified sections are locked


Часто задаваемые вопросы

Раздел всё ещё не редактируется после ProtectForm = false

Свойство ProtectForm действует только тогда, когда документ был защищён с помощью AllowOnlyFormFields. Если активен другой тип защиты, например AllowOnlyReading, установка ProtectForm в false для отдельного раздела не освободит его — ограничение всего документа имеет приоритет.

Чтобы исправить это, убедитесь, что в Protect передаётся тип защиты AllowOnlyFormFields, прежде чем освобождать отдельные разделы:

doc.Protect({ type: wasmModule.ProtectionType.AllowOnlyFormFields, password: "123" });
s2.ProtectForm = false;

Защищённый документ всё ещё можно выделять и копировать

Все пять типов защиты ограничивают редактирование, а не чтение. Например, AllowOnlyReading предотвращает изменения основного текста, но не блокирует выделение, копирование или поиск текста. Так и задумано — ограничения редактирования управляют тем, что пользователи могут изменять, а не тем, что они могут просматривать или извлекать.

Если содержимое не должно быть доступно для копирования или просмотра неавторизованными пользователями, используйте шифрование документа (пароль на открытие) вместо ограничения редактирования. Эти два подхода решают разные задачи и могут сочетаться, когда требуются и конфиденциальность, и контроль редактирования:

doc.Protect({ type: wasmModule.ProtectionType.AllowOnlyReading, password: "123456" });

См. также