如何提取允许编辑Word文档以在SharePoint Workflow中使用的编辑器?

时间:2013-02-19 21:02:54

标签: .net api ms-word extract

我正在尝试确定以编程方式从Microsoft Word文档(docx)中提取“编辑器”的最佳方法 - 具体来说,当您添加时,列表中显示的名称(或电子邮件/域用户名)列表用户通过“评论”标签 - > “保护”部分,“限制编辑”选项 - > “2.编辑限制”部分 - > “个人”列表框。如果在没有代码的情况下以某种方式实现这一点,我提到将使用SharePoint来在工作流程中提取此信息。

我相信我可以通过解压缩文件并在document.xml文件中搜索“w:permStart”节点来实现这一点,我不愿意采取这种黑客攻击的可能性,它可能会在某些时候中断微软应该决定改变一切。

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


修改

Word 2010用户界面通过Review按钮(或Protect在功能区的Restrict Editing区域的Protect Document标签下列出我要提取的名称Word 2007中的}按钮,打开Restrict Formatting and Editing面板。

在此面板的第二部分(标有2. Editing restrictions),如果没有标有Individuals的框(Exceptions (optional)下方),请检查{ {1}}复选框(在下面的下拉菜单中选择了什么并不重要)。

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

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

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

Review->Protect->Restrict Editing->Restrictions->Individuals

3 个答案:

答案 0 :(得分:1)

好的,我想出了Word隐藏这些数据的地方:)

我所做的是记录我在文档中添加编辑器并从那里进行反向工程的宏。

似乎编辑被分配到Ranges。如果那部分不是太复杂,那么这应该可以帮到你:

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

答案 1 :(得分:0)

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

您没有指定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

希望有所帮助!

答案 2 :(得分:0)

你可以试试这个:

    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)....
                }
            }