2016-02-18 4 views
2

Защищенный паролем документ OpenXml Word (т. Е. Документ, созданный в wdFormatDocument = 12), который переписывается в качестве двоичного документа Word, защищенного паролем (wdFormatDocument = 0), дает ошибку «Пароль неверно. Word не может открыть документ. "Защищенный паролем OpenXml Документ Word, сохраненный как двоичный пароль, защищенный паролем Word

В приведенном ниже коде «74.doc» создается с использованием wdFormatDocument = 12 при преобразовании этого документа обратно в wdFormatDocument = 0, он дает ошибку. Отлаживайте код и выполняйте поиск по сети, но не можете найти точную причину, почему это происходит.

Ошибка вызвана этой линии:

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; 
      } 
     } 
    } 

Update: если только для чтения, как верно указано в аргументах, документ открывается успешно. Но установка на false вызывает ошибку.

+0

Просьба также указать код, который вызывает ошибку, указывая, какая строка вызывает ее. –

+0

@Cindy: на этом lin eits get erroWord._Document oDoc = oWord.Documents.Open (ref oInput, ref oMissing, ref readOnly, ref oMissing, oReadPassword, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref isVisible, ref oMissing, ref oMissing, ref oMissing, ref oMissing); – John

+0

@Cindy, когда передается readonly как истина, документ открывается успешно.Но установить значение false его отображаемой ошибки – John

ответ

0

Внимательно посмотрите на объекты, вы передаете методу Document.SaveAs, в частности

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

Вы назначая чтение и запись паролей. Если вы это сделаете, вам необходимо принять во внимание это при открытии документа.

Пароль только для чтения предотвращает открытие документа, если пароль не указан. В Documents.Open - это пятый аргумент.

Пароль только для записи предотвращает сохранение файла с таким же именем. Однако это не мешает пользователю редактировать документ. Это восемь аргументов в Documents.Open.

Третий аргумент, ReadOnly, применяет ту же «защиту», что и пароль для записи - пользователь может редактировать документ, но не сохраняет изменения обратно к исходному документу.

В этой ситуации, когда вы использовали оба типа паролей, третий аргумент неуязвим. Вам следует назначить oMissing, ничего другого. Если пользователь должен иметь возможность редактировать и сохранять изменения обратно в документ, также укажите пароль для записи при открытии документа.

+0

Причиной ошибки является параметр writepassword 8-й аргумент в приведенном выше коде, Когда мы передаем параметр writepassword как null, документ успешно открывается в режим readonly. – John

+0

Все еще я нахожу основную причину, почему документ не открывается, когда мы предоставляем writepassword. Я не уверен, где это оставляет нас. Я провел несколько экспериментов с использованием Word, чтобы повторно сохранить документ openxml в виде двоичного кода, и вначале я смог дублировать поведение. Когда я попытался повторно сохранить новые пароли, я мог бы снова открыть документ. Попробовав несколько вариантов, я больше не мог заставить Word дублировать поведение, так что это очень озадачивает. Я подозреваю, что Word делает что-то странное и, возможно, кэширует что-то, что изменило его поведение. – John

+0

Ссылка на проверку PLS для получения более подробной информации по этой проблеме https://social.msdn.microsoft.com/Forums/en-US/07b279ce-7451-4dce-a202-976ed33a0f01/password-protected-openxml-word-document-resaved- а-а-защищенного паролем-двоичного слова? форум = worddev – John

Смежные вопросы