文書の共同編集や配布プロセスにおいて、内容の完全性と制御性は重要なセキュリティ上の要件です。Word 文書の「編集制限」機能は、ファイル単位の暗号化とは異なり、ユーザーが文書を開いて読むことを妨げるのではなく、実行可能な操作の種類を精密に制御します。たとえば、コメントの追加のみ許可する、変更履歴モードでの修正のみ許可する、または編集を完全に禁止する、といった制御が可能です。
手動で Word クライアントの「校閲」→「編集制限」パネルから単一文書に設定することは許容できますが、複数ファイルを一括処理する場合や自動化フローに組み込む必要がある場合には、プログラムによる処理がより効率的です。本記事では、Free Spire.Doc for Python 無料ライブラリを用いて、コードで Word 文書に各種編集制限を設定する方法を紹介します。
1. 環境準備
1.1 ライブラリのインストール
pip で直接インストール可能です。実行環境に Microsoft Office や WPS は不要です。
pip install Spire.Doc
補足として、無料ライブラリはファイル読み書き時に 500 段落および 25 テーブルという制限がありますが、一般的なオフィスシーンの大半で十分な水準です。
1.2 コアメソッドと列挙型
文書保護の中心となるメソッドは Document.Protect() であり、ProtectionType 列挙型と組み合わせて制限レベルを指定します。この列挙型には 5 つの値があり、Word クライアントの編集制限パネルにある全オプションに対応します。
2. 5 種類の保護タイプの詳細
2.1 保護タイプ対照表
| 列挙値 | 対応する Word 機能 | 動作説明 |
|---|---|---|
AllowOnlyReading |
変更を許可しない (読み取り専用) | 文書全体が編集不可となり、ユーザーは内容を閲覧のみ可能 |
AllowOnlyRevisions |
変更履歴 | ユーザーは内容を変更できるが、すべての変更は変更履歴として記録される |
AllowOnlyComments |
コメント | 本文は編集不可で、コメントの挿入のみ許可 |
AllowOnlyFormFields |
フォーム入力 | フォームフィールドのみ入力可能で、それ以外の領域はロック |
NoProtection |
制限なし | すべての編集制限を解除 |
2.2 読み取り専用保護(最も厳格)
読み取り専用モードでは、文書内容が完全にロックされ、ユーザーは一切の変更操作を行えません。これは正式バージョンを外部公開する際に最もよく使われる保護方法です。
from spire.doc import *
from spire.doc.common import *
# Documentオブジェクトを作成し文書を読み込む
doc = Document()
doc.LoadFromFile("サンプル文書.docx")
# 読み取り専用モードに設定し、パスワードを"123456"とする
doc.Protect(ProtectionType.AllowOnlyReading, "123456")
# 文書を保存
doc.SaveToFile("読み取り専用文書.docx")
doc.Close()
設定完了後、Word で文書を開くと、リボンの編集コマンドが無効化されます。本文領域で変更を試みると、「編集制限」パネルに適切なメッセージが表示されます。

2.3 変更履歴モード保護
変更履歴モードは、複数人での校閲シーンに適しています。すべての変更は挿入、削除、書式変更の履歴としてマークされ、文書所有者が後で個別に承認または拒否できます。
from spire.doc import *
from spire.doc.common import *
doc = Document()
doc.LoadFromFile("サンプル文書.docx")
# 変更履歴モードのみ許可に設定
doc.Protect(ProtectionType.AllowOnlyRevisions, "123456")
doc.SaveToFile("変更履歴モード文書.docx")
doc.Close()
2.4 コメントモード保護
コメントモードでは、校閲者は本文を直接変更できず、コメントを挿入して意見を述べるのみとなります。この方法は、初稿レビューなどで校閲者が原文を直接変更するのを防ぐのに便利です。
from spire.doc import *
from spire.doc.common import *
doc = Document()
doc.LoadFromFile("サンプル文書.docx")
# コメントのみ許可に設定
doc.Protect(ProtectionType.AllowOnlyComments, "123456")
doc.SaveToFile("コメントのみ文書.docx")
doc.Close()
2.5 フォームフィールド保護
文書にドロップダウンリストやテキストボックスなどのフォームコントロールが含まれる場合、AllowOnlyFormFields を使用すると本文をロックし、ユーザーはフォームフィールドへの入力のみ可能になります。このモードは各種申請書テンプレートでよく利用されます。
from spire.doc import *
from spire.doc.common import *
doc = Document()
doc.LoadFromFile("フォーム文書.docx")
# フォーム入力のみ許可に設定
doc.Protect(ProtectionType.AllowOnlyFormFields, "123456")
doc.SaveToFile("フォーム保護文書.docx")
doc.Close()
3. 文書保護の解除
3.1 パスワード既知の場合の解除方法
保護パスワードが分かっている場合は、保護タイプを NoProtection に設定することで完全に制限を解除できます。
from spire.doc import *
from spire.doc.common import *
doc = Document()
doc.LoadFromFile("保護済み文書.docx")
# 文書の編集制限を解除
doc.Protect(ProtectionType.NoProtection, "123456")
doc.SaveToFile("制限解除済み文書.docx")
doc.Close()
3.2 注意事項
- パスワード引数は保護設定時に指定したパスワードと一致している必要があります。一致しない場合、解除操作は無効です。
- 文書保護設定時にパスワードを指定しなかった場合は、
Protect(ProtectionType.NoProtection)呼び出し時にパスワード引数を省略できます。 - この操作は編集制限のみを除去し、文書の内容や書式には影響しません。
4. 応用:特定領域の編集可能化
実際の業務では、「全体ロック+部分解放」という権限モデルがしばしば求められます。例えば契約文書では、本文や条項はすべてロックし、契約日と乙方(受注者)名の 2 か所のみ入力可能にする、といったケースです。このような効果は編集可能領域によって実現できます。
実装の考え方:まず文書全体を読み取り専用保護に設定し、次に指定位置に PermissionStart および PermissionEnd マーカーを挿入します。この 2 つのマーカーに挟まれた領域が例外(編集可能)となります。
from spire.doc import *
from spire.doc.common import *
doc = Document()
doc.LoadFromFile("サンプル文書.docx")
# 例として、最初のセクションの3番目の段落を取得
section = doc.Sections[0]
paragraph = section.Paragraphs[2]
# 段落の先頭に編集可能領域の開始マーカーを挿入
permission_start = PermissionStart(doc, "edit_area_001")
paragraph.ChildObjects.Insert(0, permission_start)
# 段落の末尾に編集可能領域の終了マーカーを挿入
permission_end = PermissionEnd(doc, "edit_area_001")
paragraph.ChildObjects.Add(permission_end)
# 文書保護を設定すると、これらのマーカーで囲まれた範囲は制限対象外となる
doc.Protect(ProtectionType.AllowOnlyReading, "123456")
doc.SaveToFile("部分編集可能文書.docx")
doc.Close()
いくつかの重要なポイント:
-
PermissionStartとPermissionEndは、同じpermissionIdを使用して初めてペアとして機能します。 - 編集可能領域の開始・終了マーカーは同一段落内に挿入する必要があります。段落をまたがるマーカーは予期せぬ動作を引き起こす可能性があります。
- 編集可能領域が有効になるのは、文書が保護状態にある場合のみです。保護されていない文書では、これらのマーカーは実際には機能しません。
- 編集可能領域を削除するには、文書の子オブジェクトを走査し、対応する
PermissionStart/PermissionEndを削除します。
以上の方法により、Word 文書にさまざまなレベルの編集制限を柔軟に設定し、単純な読み取り専用保護からきめ細かな権限制御まで、多様なシーンに対応することができます。
