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(ダウンロード)を使えば、この二層保護のすべての操作を Python で完結できる。Encrypt で開封パスワードを設定し、Protect で ProtectionType 列挙により編集動作を制限し、PermissionStart と PermissionEnd で保護範囲内の特定段落を開放し、ToPdfParameterList で PDF 変換時に暗号化を設定する。

pip install spire.doc.free

本記事の入力文書は「プロジェクト管理規程」で、三つの節から構成される。表紙(タイトル、版、秘密区分、作成部門)、本文(三章の条項と職責分担表)、付録(改訂履歴表)。すべての操作はこの文書に対して行い、産物は実際の実行結果と一致する。

Free 版は文書あたりの段落数と節数に上限がある。本記事のサンプル文書は 3 節 16 段落で、上限の影響を受けない。上限を超える場合は商用版が必要。

暗号化:開封パスワードの設定

Encrypt はファイル層に作用し、文書全体の内容を暗号化する。開封時にパスワードの入力が必須となり、文書内の具体的な内容とは無関係である。文書を読み込み、パスワードを設定し、別名で保存するだけである。

from spire.doc import *
from spire.doc.common import *

document = Document()
document.LoadFromFile("プロジェクト管理規程.docx")
document.Encrypt("Pm@2026")
document.SaveToFile("暗号化文書.docx", FileFormat.Docx)
document.Close()

生成された「暗号化文書.docx」を Word で開くとパスワード入力ダイアログが表示され、正しいパスワードでのみ内容を閲覧できる。Spire.PDF でパスワードなしで読み込むと The document is encrypted and a password is required to open it が発生し、パスワードを指定すれば正常に開ける。

暗号化後に文書を開くとパスワード入力ダイアログが表示される

復号には RemoveEncryption を明示的に呼ぶ必要がある。見落としやすい点として、パスワード付きで LoadFromFile した後にそのまま SaveToFile しても、出力文書にはまだパスワードがかかったままである——暗号化状態は文書オブジェクトに保持され、読み込み時にパスワードを指定しただけでは自動的に解除されない。正しい手順は読み込み後に RemoveEncryption を呼んでから保存することである。

document = Document()
document.LoadFromFile("暗号化文書.docx", FileFormat.Docx, "Pm@2026")
document.RemoveEncryption()
document.SaveToFile("復号文書.docx", FileFormat.Docx)
document.Close()

編集保護:開封後の変更方式の制限

Protect は ProtectionType 列挙により編集動作を制限する。第二引数は保護解除時に必要なパスワードである。暗号化とは異なり、編集保護は開封を制限しない。誰でも文書を閲覧できるが、自由な変更はできない。五つの値が一般的な制限シナリオを覆す。

ProtectionType 許可される操作 典型的な用途
AllowOnlyReading 閲覧のみ 確定版の規程文書、一切の変更を禁止
AllowOnlyComments 閲覧 + コメント 意見募集稿、コメントは可能だが本文は変更不可
AllowOnlyRevisions 閲覧 + 変更履歴 校閲流程、変更は修正モードで記録される
AllowOnlyFormFields 閲覧 + フォームフィールド入力 固定テンプレートの帳票、入力のみ許可
NoProtection 制限なし 編集保護の解除

同一文書に対して読み取り専用、コメントのみ、修正のみの三種類の保護をそれぞれ設定する。

configs = [
    (ProtectionType.AllowOnlyReading, "読み取り専用.docx"),
    (ProtectionType.AllowOnlyComments, "コメントのみ.docx"),
    (ProtectionType.AllowOnlyRevisions, "修正のみ.docx"),
]

for ptype, outFile in configs:
    document = Document()
    document.LoadFromFile("プロジェクト管理規程.docx")
    document.Protect(ptype, "Edit@2026")
    document.SaveToFile(outFile, FileFormat.Docx2013)
    document.Close()

Word で「読み取り専用.docx」を開くと上部に保護バーが表示され、本文を変更しようとすると保護の通知が出る。「コメントのみ.docx」はコメントの挿入が可能だが文字の置換はできない。「修正のみ.docx」での変更は赤色の変更履歴として残り、原文を直接上書きしない。

読み取り専用保護文書の Word における保護バー

編集保護の解除は Protect(ProtectionType.NoProtection) で行う。これは編集層に作用し、暗号化層の RemoveEncryption とは互いに代替しない。

局所編集可能:読み取り専用文書内で特定段落を開放

実運用では「全体を固定し、特定の数段落だけ入力可能にする」ことが多い。例えば規程文書で承認欄のみ記入を許可し、それ以外は変更禁止にする。PermissionStart と PermissionEnd を対で使い、その間の内容を編集可能にする。前提として全文書に保護が設定されている必要がある。以下では文書を読み取り専用に設定した上で、本文第一条の段落だけを開放する。

document = Document()
document.LoadFromFile("プロジェクト管理規程.docx")
document.Protect(ProtectionType.AllowOnlyReading, "Edit@2026")

targetPara = document.Sections[1].Body.Paragraphs[1]
start = PermissionStart(document, "editableRule1")
end = PermissionEnd(document, "editableRule1")
targetPara.ChildObjects.Insert(0, start)
targetPara.ChildObjects.Add(end)

document.SaveToFile("局所編集可能.docx", FileFormat.Docx)
document.Close()

権限マークは段落の ChildObjects の先頭と末尾に挿入する。Insert(0, start) で先頭に、Add(end) で末尾に置き、両者の間にあるすべての子オブジェクトが編集可能範囲に含まれる。Word でこの文書を開くと、本文全体は変更できないが、第一条の段落だけは通常通り編集でき、それ以外の段落は読み取り専用のままとなる。

局所編集可能文書:第一条のみ編集可能

節級制御:一部の章を固定し、残りを開放

複数節の文書では、一部の節だけを固定したい場合がある。まず全文書に保護を設定し、開放したい節だけ個別に解除する。ProtectForm プロパティがその節が全文書の保護を受けるかを制御する。以下では全文書をフォームフィールドのみ保護に設定し、表紙と本文は固定したまま、付録だけを開放して改訂履歴の追記を許可する。

document = Document()
document.LoadFromFile("プロジェクト管理規程.docx")
document.Protect(ProtectionType.AllowOnlyFormFields, "Edit@2026")
document.Sections[2].ProtectForm = False
document.SaveToFile("節級ロック.docx", FileFormat.Docx2013)
document.Close()

ここでは AllowOnlyReading ではなく AllowOnlyFormFields を使う。節級の解除はフォームフィールド保護機構に依存するためで、読み取り専用保護は文書全体に作用し、節ごとに個別に開放できない。生成された文書では、表紙と本文は編集できず、付録の改訂履歴表だけ自由に記入できる。

節級ロック:付録は編集可能、本文は固定

PDF 変換と暗号化:配布工程の統一保護

正式な配布では Word を PDF に変換してから暗号化することが多い。受け手に編集可能なソースファイルを渡さないためである。ToPdfParameterList が変換パラメータを保持し、その PdfSecurity プロパティで出力 PDF に開封パスワードを設定できる。Word 層の暗号化とは互いに影響しない。

document = Document()
document.LoadFromFile("プロジェクト管理規程.docx")

toPdf = ToPdfParameterList()
toPdf.PdfSecurity.Encrypt("Pdf@2026")
document.SaveToFile("規程文書_暗号化.pdf", toPdf)
document.Close()

生成された PDF は 113072 バイトで、開く際にパスワード Pdf@2026 の入力が必要である。元の Word 文書が暗号化されていなくても、出力 PDF は独立して暗号化できる。逆に、元文書が暗号化されていても、PDF 変換でデフォルトではパスワードは引き継がれず、PdfSecurity で別途設定する必要がある。

PDF 変換と暗号化:開封時にパスワード入力が必要

復号と保護解除

復号と保護解除は異なる層に作用するため、個別に処理する必要がある。完全なコードで、暗号化文書を復号し、読み取り専用保護文書の保護を解除する。

# 復号:開封パスワードの削除
document = Document()
document.LoadFromFile("暗号化文書.docx", FileFormat.Docx, "Pm@2026")
document.RemoveEncryption()
document.SaveToFile("復号文書.docx", FileFormat.Docx)
document.Close()

# 編集保護の解除
doc = Document()
doc.LoadFromFile("読み取り専用.docx")
doc.Protect(ProtectionType.NoProtection)
doc.SaveToFile("保護解除.docx", FileFormat.Docx2013)
doc.Close()

復号後の「復号文書.docx」はパスワードなしで開け、内容は元文書と一致する。「保護解除.docx」は編集制限が解除され、自由に変更できる。文書に暗号化と編集保護が同時に設定されている場合、RemoveEncryption と Protect(NoProtection) を別々に呼ぶ必要があり、順序は問わない。

いつどの保護を使うか

暗号化は文書の閲覧範囲を制御するのに適する。社外配布の契約書、見積書、人事資料は、パスワードなしでは関係者以外に開かれるリスクがある。編集保護は文書が閲覧可能だが変更を制限したい場面に適する。規程文書は読み取り専用保護で誤修正を防ぎ、意見募集稿はコメントのみ保護でフィードバックを集め、校閲は修正のみ保護で変更痕跡を残す。二層の併用は、アクセス制限も編集制限も必要な高機密文書に使う。例えば暗号化と読み取り専用保護を組み合わせた契約書は、パスワードが漏洩しても内容を直接改竄できない。

配布工程では、これらの操作を自動化スクリプトに直せる。文書生成後に機密区分に応じた保護を設定し、PDF 変換時に暗号化を同期し、最後に保護済みファイルを配布チャネルに送る。批量処理では各文書に対してループで実行し、パスワードは設定ファイルやデータベースから取得して、スクリプト内に直接書き込まないようにする。

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?