Как я могу отладить поврежденный файл 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);
}
Ответ 4
web docx validator работал у меня: http://ucd.eeonline.org/validator/index.php