【问题标题】:How would I extract editors allowed to edit a Word document for use in a SharePoint Workflow?如何提取允许编辑 Word 文档以在 SharePoint 工作流中使用的编辑器?
【发布时间】:2013-02-04 17:12:19
【问题描述】:

我正在尝试确定以编程方式从 Microsoft Word 文档 (docx) 中提取“编辑器”的最佳方法 - 特别是添加时出现在列表中的名称列表(或电子邮件/域用户名)用户通过“审阅”选项卡->“保护”部分,“限制编辑”选项->“2.编辑限制”部分->“个人”列表框。如果这可以在没有代码的情况下以某种方式实现,我提到 SharePoint 将用于在工作流中提取此信息。

我相信我可以通过解压缩文件并在 document.xml 文件中搜索“w:permStart”节点来做到这一点,但我不愿诉诸这种黑客攻击,因为它可能会在某些时候中断微软应该决定改变吗?

Office API 似乎提供了一种可能性 (Editor Interface),但我现在无法对此进行测试,而且我不确定它是否处于正确的 api 级别,因为它是一个接口而不是实际属性文档对象或类似的。


编辑

Word 2010 UI 通过Restrict Editing 按钮(或 Word 2007 中的Protect Document 按钮)在功能区的Protect 区域的Review 选项卡下列出我要提取的名称,其中打开Restrict Formatting and Editing 面板。

在此面板的第二部分(标记为 2. Editing restrictions),如果没有标记为 Individuals 的框(在 Exceptions (optional) 下方),请选中 Allow only this type of editing in the document 复选框(它在随后的下拉列表中选择什么并不重要)。

这将允许在 Exceptions (optional) 部分下添加用户,这是通过单击 More users... 链接打开一个对话框来完成的,其中输入电子邮件地址(连接到 Microsoft 身份验证服务器)或域用户帐户(如果Word 当时正在域系统上运行),用分号分隔。这些用户将被添加到标记为 Individuals 的列表中 - 这是我想从 word 文档中提取的列表(如下图所示)。

此列表用于对下拉列表中指定的一般文档规则进行“例外”,并且只会保存与给定例外范围相关联的名称 - 通过将电子邮件或名称添加到列表中来创建范围,选择一段文本(或整个文档),然后选中该名称旁边的复选框以将其与所选范围相关联。保存文档时,对该名称的引用将作为一个或多个 w:permStart 元素(每个文本范围一个元素)的 w:ed 属性添加到基础 document.xml 文件中

可以解压缩 docx 文件,解析 document.xml 文档并提取这些元素中这些属性中的所有名称,但是如果有 Microsoft Word API 替代方式这样做 - 我更喜欢通过 API,因为它几乎肯定会更易于维护和稳定。

【问题讨论】:

  • 这些数据在 Word UI 中保存在哪里?我只能找到“相关人员”...
  • @DerekTomes 感谢您的问题(我试图在第一段中指出这一点,但是...)请参阅上面的编辑以详细说明如何查找(或在必要时重新创建) Word UI 中的名称列表

标签: .net api ms-word extract


【解决方案1】:

好的,我知道 Word 将这些数据隐藏在哪里了 :)

我所做的是录制一个宏,将我添加到文档中并从那里进行逆向工程。

似乎编辑器被分配给范围。如果这部分不是太复杂,这应该可以帮助您完成大部分工作:

Dim wordApp As New Word.Application
Dim wordDocument As Word.Document = wordApp.Documents.Open("C:\MyDoc.docx")

Dim allEditors As Word.Editors = wordDocument.Range(0, 0).Editors
For i As Integer = 1 To allEditors.Count
    Debug.Print(allEditors.Item(i).Name)
Next

wordDocument.Close()

【讨论】:

  • 我已经查看了范围页面二十次,并忽略了它,因为我认为我必须逐步浏览每个字符(即Range(0,0).Editors...Range(1,1).Editors...Range(2,2). ..etc),但看起来这是使用 API 的唯一可能性 - (0,0) 参数是否以某种方式引用所有编辑器?还是我必须遍历每个字符范围?再次 - 我目前还没有设置自己对此进行编程 - 请使用此信息更新您的答案(按书面形式进行单次调用或需要循环查找所有编辑器),我会选择它。谢谢!
  • Range(0,0) 只是文档的开头。至于其余的,我不知道,我建议可能需要进行一些实验。这主要取决于您如何实现编辑器安全性。如果您在整个文档中以相同的方式实现它,那么您可能需要做的就是测试第一个字符。
  • 目标是提取所有拥有修改文档任何部分的“权利”的编辑者 - 但是,经过进一步研究,微软在服务器环境中似乎不支持互操作,所以我要走 xml 路线(他们说他们确实支持)
  • 这可能是最好的方法。我曾尝试在服务器环境中使用 Word.Interop,但它有很多问题。
【解决方案2】:

这将为您提供对当前文档进行修订的所有作者的列表。它并不漂亮,但它演示了一种提取它们的方法。

您没有指定 VB.Net 或 C#,但我认为如果这是您的首选语言,您可以将其转换为 C#。

Imports Microsoft.Office.Interop
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim wordApp As New Word.Application
        Dim wordDocument As Word.Document = wordApp.Documents.Open("c:\MyDoc.docx")
        Dim editors As New Dictionary(Of String, String)

        ' Iterate through all the revisions
        For Each r As Word.Revision In wordDocument.Revisions()
            If Not editors.ContainsKey(r.Author.ToString) Then
                editors.Add(r.Author.ToString(), r.Author)
            End If
        Next

        ' List all the unique authors
        For Each s As String In editors.Values
            Debug.Print(s)
        Next
        wordDocument.Close()
    End Sub
End Class

希望有帮助!

【讨论】:

  • 如果我理解的话,这将是过去编辑过文档的用户(修订版) - 我正在寻找那些允许编辑的用户列表文档(或指定范围)作为“文档保护”方案的例外
【解决方案3】:

你可以试试这个:

    for (int j = 1; j <= wordDocument.Sections.Count; j++)

            {
                for (int i = 1; i <= wordDocument.Sections[j].Range.Editors.Count; i++)
                {
                      //your code here
                    wordDocument.Sections[j].Range.Editors.Item(i)....
                }
            }

【讨论】:

  • 你能详细说明为什么这会有所帮助吗?
猜你喜欢
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多