Как я могу отладить поврежденный файл docx?

У меня проблема, когда файлы .doc и .pdf выводятся нормально, но файл .docx выходит из строя.

Чтобы решить эту проблему, я пытаюсь отладить, почему .docx поврежден.

Я узнал, что формат docx намного более строг в отношении дополнительных символов, чем либо .pdf, либо .doc. Поэтому я искал различные файлы xml в файле docx, ищущем недопустимый XML. Но я не могу найти. Все это подтверждается штрафом.

xml files I've been checking out

Может ли кто-нибудь предложить мне сейчас расследование?

UPDATE:

Полный список файлов внутри папки выглядит следующим образом:

/_rels
    .rels

/customXml
    /_rels
        .rels
    item1.xml
    itemProps1.xml

/docProps
    app.xml
    core.xml

/word
    /_rels
        document.xml.rels
    /media
        image1.jpeg
    /theme
        theme1.xml
    document.xml
    fontTable.xml
    numbering.xml
    settings.xml
    styles.xml
    stylesWithEffects.xml
    webSettings.xml

[Content_Types].xml

ОБНОВЛЕНИЕ 2:

Я также должен был упомянуть, что причиной коррупции является почти наверняка плохой двоичный файл POST от моего имени.

Почему файлы docx повреждены двоичным сообщением, но .doc и .pdf в порядке?

ОБНОВЛЕНИЕ 3:

Я пробовал демонстрацию различных инструментов для восстановления docx. Кажется, что все они исправляют файл в порядке, но не дают никаких указаний относительно причины ошибки.

Мой следующий шаг - изучить содержимое поврежденного файла с исправленной версией.

Если кто-нибудь знает инструмент восстановления docx, который дает достойное сообщение об ошибке, я был бы признателен за это. На самом деле я могу опубликовать это как отдельный вопрос.

ОБНОВЛЕНИЕ 4 (2017)

Я никогда не решал эту проблему. Я попробовал все инструменты, предложенные в ответах ниже, но никто из них не работал у меня.

С тех пор я немного продвинулся и обнаружил, что блок 0000 отсутствует при открытии .docx в Sublime Text. Подробнее в новом вопросе здесь: Что может быть причиной этого повреждения в файлах .docx во время httpwebrequest?

Ответ 1

Обычно, когда есть ошибка с конкретным XML файлом, Word сообщает вам, в какой строке файла происходит ошибка. Поэтому я считаю, что проблема исходит либо от Zipping файла, либо от структуры папок.

Вот структура папок файла Word:

Формат .docx - это zipped файл, содержащий следующие папки:

+--docProps
|  +  app.xml
|  \  core.xml
+  res.log
+--word //this folder contains most of the files that control the content of the document
|  +  document.xml //Is the actual content of the document
|  +  endnotes.xml
|  +  fontTable.xml
|  +  footer1.xml //Containst the elements in the footer of the document
|  +  footnotes.xml
|  +--media //This folder contains all images embedded in the word
|  |  \  image1.jpeg
|  +  settings.xml
|  +  styles.xml
|  +  stylesWithEffects.xml
|  +--theme
|  |  \  theme1.xml
|  +  webSettings.xml
|  \--_rels
|     \  document.xml.rels //this document tells word where the images are situated
+  [Content_Types].xml
\--_rels
   \  .rels

Кажется, что у вас есть только то, что находится внутри папки слов, не так ли? Если это не сработает, не могли бы вы либо отправить поврежденный Docx, либо опубликовать структуру ваших папок внутри вашего почтового индекса?

Ответ 2

Я использовал "Инструмент производительности Open XML SDK 2.5" (http://www.microsoft.com/en-us/download/details.aspx?id=30425), чтобы найти проблему со сломанной ссылкой гиперссылки.

Сначала вам нужно загрузить/установить SDK, затем инструмент. Инструмент откроет и проанализирует документ для проблем.

Ответ 3

Много лет поздно, но я нашел это, которое действительно сработало для меня. (Из https://msdn.microsoft.com/en-us/library/office/bb497334.aspx)

(wordDoc является WordprocessingDocument)

using DocumentFormat.OpenXml.Validation;

        try
        {
            var validator = new OpenXmlValidator();
            var count = 0;
            foreach (var error in validator.Validate(wordDoc))
            {
                count++;
                Console.WriteLine("Error " + count);
                Console.WriteLine("Description: " + error.Description);
                Console.WriteLine("ErrorType: " + error.ErrorType);
                Console.WriteLine("Node: " + error.Node);
                Console.WriteLine("Path: " + error.Path.XPath);
                Console.WriteLine("Part: " + error.Part.Uri);
                Console.WriteLine("-------------------------------------------");
            }

            Console.WriteLine("count={0}", count);
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }