65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 和 Word 自动化保护 Word 文档

starIconstarIconstarIconstarIconstarIcon

5.00/5 (12投票s)

2015 年 11 月 25 日

CPOL

6分钟阅读

viewsIcon

40054

downloadIcon

1473

本文将介绍如何使用 C# 和 Word 自动化保护 Word 文档。

您是否正在寻找一种以编程方式保护 Word 文档的方法?您是否正在寻找一种赋予 Word 文件“只读”访问权限的方法,以便没有人可以编辑它?您是否正在寻找一种方法来保护您的 Word 文件,使其只能用于“查看目的”,并且没有人可以复制其内容?您是否正在寻找一种方法来保护您的 Word 文件,以便可以跟踪/审计另一人所做的更改?

如果答案是肯定的,那么您来对地方了,我们可以以编程方式保护我们的 Word 文件并涵盖上述所有场景,本文将回答您所有关于 Word 安全性的问题。

 

背景

大多数时候,我们使用 Microsoft Word 来记录我们的文档,我们希望它足够安全,但我们真的知道如何使 Word 文件安全吗?我们中的许多人对此并不了解,我们知道可以为 Word 文件添加多少种安全性?如果不知道,别担心,这篇文章将带您畅游安全的世界。

开始吧

如何保护 Word 文件?

1. 文件级别保护

1. 文档要求密码打开文件(打开文件安全),没有密码文件将无法打开。

2. 文档要求密码编辑文件(修改文件安全),如果我们没有修改密码,我们仍然可以以只读模式打开文件。

注意:如果您丢失或忘记密码,则不容易恢复。

2. 内容级别保护

通过此类型的保护,我们可以处理文件内容安全,共有 5 种保护类型,如下所示:

1. 只读

2. 跟踪修订

3. 仅批注

4. 填写表单

5. 部分锁定

让我们详细讨论它们。

1. 只读保护

如果我们使用只读保护来保护文档,那么文档将被锁定,所有编辑选项都将被禁用。要应用此安全性,您需要转到开发人员选项卡 - 选择保护文档 - 选择限制格式设置和编辑 - 选择仅此类型的编辑在文档中复选框 - 从下拉列表中选择无更改(只读)选项,然后单击是,开始强制执行保护按钮,请参见下面的截图。

找不到“开发人员”选项卡?请参见下图。

启用只读保护

2. 仅批注保护

如果我们使用仅批注保护来保护文档,那么文档将被锁定,所有编辑选项都将被禁用,唯一的区别是我们只能在文档中添加批注。文档被仅批注锁定后,每个用户的批注都将以不同的颜色记录以供识别。您可以按照上述相同步骤锁定文档,只需从下拉列表中选择“批注”,请参见下面的截图,查看文档在批注下的行为,请参见下面的截图。

3. 跟踪修订

一旦文档被锁定为“跟踪修订”,它就可以被编辑,但用户所做的所有活动/更改都会被跟踪,更改会以不同于原始文档字体颜色的颜色着色,从而轻松识别更改。请参见下面的截图。

4. 填写表单

一旦文档被锁定为“填写表单”选项,我们只能在表单字段中填写文本,所有其他编辑选项均被禁用,请参见下面的截图。

5. 部分锁定/分段锁定

Word 文件可以进行部分锁定,没有直接的选项可以锁定部分文件或分段文件,我们可以通过以下步骤实现:

- 单击保护文档 - 选择限制格式设置和编辑 - 在编辑限制中选择无更改(只读) - 选择您希望自由编辑的文档部分 - 在例外中选择所有人复选框,最后单击“是,开始强制执行保护”按钮,请参见下面的截图。

代码之旅

我们已经看到了 Word 中的所有保护类型,我们已经手动锁定它们,现在是时候以编程方式进行操作了。

所需内容 

在开始准备之前,我们需要 Visual Studio、C# 和 Word(2007+)。

入门

第一步是在 Visual Studio 中创建一个新的 C# 解决方案,并在我们的代码中添加 interop 程序集的引用,interop 库的版本取决于 Microsoft 的版本,请参见下表。

已安装的 MS-Word Interop 版本
2003 8.0 Word 对象库
2007 12.0 Word 对象库
2010 14.0 Word 对象库
2013 15.0 Word 对象库

如果您是 Word Interop 自动化与 C# 的初学者,那么您应该参考这篇文章 使用 C# 进行 Word 自动化, 添加 interop 引用后,我们需要创建 Application 对象和 Document 对象,请参见下面的代码片段。

Word._Application objApp = null;
Word._Document objDoc = null;

创建 Application 和 Document 对象后,我们可以打开任何文档并轻松访问它们,请逐个参见下面的代码片段。

1. 打开文件安全(打开文件的密码)

//Create application object and open existing document
objApp = new Word.Application();
objDoc = objApp.Documents.Open(ref fileToOpen, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss);

if (objDoc.ProtectionType == Word.WdProtectionType.wdNoProtection) //check if the document is alreay protected
{
    objDoc.Password = szPassword.ToString(); //set password to open file
    objDoc.ReadOnlyRecommended = false;
    objDoc.Save(); //save word document
    MessageBox.Show("Word locked for OpenFile successfully !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    MessageBox.Show("Word document is already protected !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

在上面的代码片段中,我们使用文档对象的ProtectionType属性来检查文档是否已受保护,并且Password有助于我们设置打开 Word 文档的密码。

2. 修改文件安全(修改文件的密码)

//Create application object and open existing document
objApp = new Word.Application();
objDoc = objApp.Documents.Open(ref fileToOpen, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss);

if (objDoc.ProtectionType == Word.WdProtectionType.wdNoProtection)
{
    objDoc.Password = "";
    objDoc.WritePassword = szPassword.ToString(); //use WritePassword attribute to set password for modify file
    objDoc.ReadOnlyRecommended = false;
    objDoc.Save();
    MessageBox.Show("Word locked for Modify File scurity successfully !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    MessageBox.Show("Word document is already protected !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

在上面的代码片段中,我们使用WritePassword属性来设置修改文件的密码,Save() 方法用于保存文档。

3. 只读保护

//Create application object and open existing document
objApp = new Word.Application();
objDoc = objApp.Documents.Open(ref fileToOpen, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss);

if (objDoc.ProtectionType == Word.WdProtectionType.wdNoProtection)
{
    objDoc.Protect(Word.WdProtectionType.wdAllowOnlyReading, ref bFalse, ref szPassword, ref bFalse, ref bTrue); //use protect method to protect your word file
    objDoc.Save();
    MessageBox.Show("Word document Protected successfully (for Read only)!", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    MessageBox.Show("Word document is already protected !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

在上面的代码片段中,我们使用Protect方法来锁定文档,Protect 方法根据我们使用的参数进行工作,在这里我们传入了“wdAllowOnlyReading”枚举来保护文件为只读。

4. 仅批注保护

//Create application object and open existing document
objApp = new Word.Application();
objDoc = objApp.Documents.Open(ref fileToOpen, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss);

if (objDoc.ProtectionType == Word.WdProtectionType.wdNoProtection)
{
    objDoc.Protect(Word.WdProtectionType.wdAllowOnlyComments, ref bFalse, ref szPassword, ref bFalse, ref bTrue); //here we use 'wdAllowOnlyComments' as protection type to locked word document
    objDoc.Save();
    MessageBox.Show("Word document Protected successfully (for Comments only)!", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    MessageBox.Show("Word document is already protected !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

在上面的代码片段中,我们使用“wdAllowCommentsOnly”作为保护类型来锁定 Word 文档仅用于批注。

4. 跟踪修订

//Create application object and open existing document
objApp = new Word.Application();
objDoc = objApp.Documents.Open(ref fileToOpen, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss);

if (objDoc.ProtectionType == Word.WdProtectionType.wdNoProtection)
{
    objDoc.Protect(Word.WdProtectionType.wdAllowOnlyRevisions, ref bFalse, ref szPassword, ref bFalse, ref bTrue); //wdAllowOnlyRevisions used for Tracked changes locking
    objDoc.Save();
    MessageBox.Show("Word document Protected successfully (for TrackChanges only)!", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    MessageBox.Show("Word document is already protected !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

在上面的代码片段中,我们使用“wdAllowOnlyRevisions”作为保护类型来锁定 Word 文档仅用于跟踪修订。

5. 填写表单

//Create application object and open existing document
objApp = new Word.Application();
objDoc = objApp.Documents.Open(ref fileToOpen, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss);

if (objDoc.ProtectionType == Word.WdProtectionType.wdNoProtection)
{
    objDoc.Protect(Word.WdProtectionType.wdAllowOnlyFormFields, ref bFalse, ref szPassword, ref bFalse, ref bTrue); //use protect method to protect your word file
    objDoc.Save();
    MessageBox.Show("Word document Protected successfully (for Read only)!", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
    MessageBox.Show("Word document is already protected !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

在上面的代码片段中,我们使用“wdAllowOnlyFormsFields”作为保护类型来锁定 Word 文档仅用于表单字段锁定。

解锁 Word 文档

//Create application object and open existing document
objApp = new Word.Application();
objDoc = objApp.Documents.Open(ref fileToOpen, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss,
    ref objMiss, ref objMiss, ref objMiss, ref objMiss, ref objMiss);

if (objDoc.ProtectionType != Word.WdProtectionType.wdNoProtection)
{
    objDoc.Unprotect(ref szPassword);
    objDoc.Save();
    MessageBox.Show("Word document UnProtected successfully !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
    MessageBox.Show("Selected word document is not protected !", "Word Protect", MessageBoxButtons.OK, MessageBoxIcon.Error);

在上面的代码片段中,我们使用“UnProtect()”方法来解除 Word 文档的保护。

最后...

COM/Interop 对象非常庞大且是非托管对象,GC 本身无法收集和释放它们,我们应该在使用后释放对象,finally是释放所有 com 对象的推荐位置,Close()quit() 方法分别用于释放 Document 和 Application 对象。请参见下面的代码片段。

finally
{
    //Winword is heavy and unmanaged object, you should release all resources used for it
    if (objDoc != null)
    {
        objDoc.Close();
        objDoc = null;
    }
    if (objApp != null)
    {
        objApp.Quit();
        objApp = null;
    }
}
应用场景

- 如果您希望您的 Word 文档在打开文件时要求密码,您可以使用打开文件密码安全

- 如果您只想以只读方式打开文件,您可以使用修改文件安全只读保护

- 如果您希望人们编辑您的文件但需要审计所做的更改,您可以使用跟踪修订安全

- 如果您不希望人们复制/粘贴您的 Word 文件内容并且不希望他们进行编辑,那么您可以使用表单填写安全锁定 Word 文档。

- 如果您有可填写的表单,并且希望人们仅在表单字段中进行编辑,那么您可以使用表单填写安全锁定 Word 文档。

- 如果您希望人们仅编辑您文档的某个部分,您可以使用部分锁定安全

用 Word 应用程序进行编程是一件史诗般的事情,它不会在几篇文章中完成,我将在本文的后续版本中涵盖更多内容,在此之前,您可以尽情享受这些内容。

文章范围:MS-Word 2007/2010/2013+,Visual studio 2005+

欢迎提出建议和疑问。

谢谢

koolprasad2003

© . All rights reserved.