受密码保护的OpenXml Word文档已重新保存为受密码保护的二进制Word

时间:2016-02-18 04:24:48

标签: c# .net ms-word office-interop com-interop

受密码保护的OpenXml Word文档(即在wdFormatDocument = 12中创建的文档)被重新保存为受密码保护的二进制Word文档(wdFormatDocument = 0),并显示“密码错误.Word无法打开文档”。

在下面的代码中,当将此doc转换回wdFormatDocument = 0时,使用wdFormatDocument = 12创建“74.doc”,它给出了错误。调试代码并在网上搜索,但无法找到导致这种情况发生的确切根本原因。

此行触发错误:

oDoc = oWord.Documents.Open(ref oInput, ref oMissing, ref readOnly, ref oMissing, oReadPassword, ref oMissing, ref oMissing, oWritePassword , ref oMissing, ref oMissing, ref oMissing, ref isVisible, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

这是代码

    class Docx
    {
        public static void Start()
        {
            // Convert Input.docx into Output.doc
            Convert(@"C:\Test\74.doc", @"C:\Test\74_0.doc", WdSaveFormat.wdFormatDocument);

        }

        // Convert a Word .docx to Word 2003 .doc
        public static void Convert(string input, string output, WdSaveFormat format)
        {
            // Create an instance of Word.exe
            Word._Application oWord = new Word.Application();

            // Make this instance of word invisible (Can still see it in the taskmgr).
            oWord.Visible = false;

            // Interop requires objects.
            object oMissing = System.Reflection.Missing.Value;
            object isVisible = true;
            object readOnly = false;
            object oInput = input;
            object oOutput = output;
            object oFormat = format;
            object oWritePassword = "abc";
            object oReadPassword = "xyz";

            try
            {
                // Load a document into our instance of word.exe
                Word._Document oDoc = oWord.Documents.Open(ref oInput, ref oMissing, ref readOnly, ref oMissing, oReadPassword, ref oMissing, ref oMissing, oWritePassword, ref oMissing, ref oMissing, ref oMissing, ref isVisible, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

                // Make this document the active document.
                oDoc.Activate();

                // Save this document in Word 2003 format.
                oDoc.SaveAs(ref oOutput, ref oFormat, ref oMissing, oReadPassword, ref oMissing, oWritePassword, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

                // Always close Word.exe.
                oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

更新:当在参数中指定readonly为true时,文档成功打开。但设置为false会导致错误。

1 个答案:

答案 0 :(得分:0)

仔细查看您传递给Document.SaveAs方法的对象,特别是

        object oWritePassword = "abc";
        object oReadPassword = "xyz";

您正在分配读写密码。如果您这样做,那么在打开文档时需要考虑它。

只读密码可防止文档打开,除非提供密码。在Documents.Open中 - 这是第五个参数。

只写密码可防止文件保存为同名。但是,它不会阻止用户编辑文档。这是Documents.Open中的八个参数。

第三个参数,ReadOnly,应用相同的"保护"作为只写密码 - 用户可以编辑文档但不能将更改保存回原始文档。

在这种情况下,你使用过两种类型的密码,第三个参数是无关紧要的。你应该为它分配oMissing,没有别的。如果用户应该能够编辑并将更改保存回文档,则在打开文档时也会提供写入密码。