0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python で Word 文書に編集制限を設定する

0
Posted at

文書の共同編集や配布プロセスにおいて、内容の完全性と制御性は重要なセキュリティ上の要件です。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 で文書を開くと、リボンの編集コマンドが無効化されます。本文領域で変更を試みると、「編集制限」パネルに適切なメッセージが表示されます。
WordEditingRestrict.png

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()

RestrictTrackedChanges.png

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()

いくつかの重要なポイント:

  • PermissionStartPermissionEnd は、同じ permissionId を使用して初めてペアとして機能します。
  • 編集可能領域の開始・終了マーカーは同一段落内に挿入する必要があります。段落をまたがるマーカーは予期せぬ動作を引き起こす可能性があります。
  • 編集可能領域が有効になるのは、文書が保護状態にある場合のみです。保護されていない文書では、これらのマーカーは実際には機能しません。
  • 編集可能領域を削除するには、文書の子オブジェクトを走査し、対応する PermissionStart / PermissionEnd を削除します。

以上の方法により、Word 文書にさまざまなレベルの編集制限を柔軟に設定し、単純な読み取り専用保護からきめ細かな権限制御まで、多様なシーンに対応することができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?