Word обнаружил нечитаемый контент в xxx.docx после разделения docx с помощью openxml - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть full.docx, который включает в себя два математических вопроса: docx включает в себя несколько картинок и уравнение MathType (oleobject), я разделил do c в соответствии с this , получил два файла (первый. docx, second.docx), first.docx работает нормально, однако, second.docx выдает диалоговое окно с предупреждением, когда я пытаюсь его открыть:

"Word found unreadable content in second.docx. Do you want to recover the contents of this document? If you trust the source of this document, click Yes."

После нажатия «Да», do c можно открыть, содержание тоже правильно, я хочу знать, что не так с second.docx? Я проверил это с помощью «инструмента повышения производительности Open xml sdk 2.5», но не нашел причины. Очень ценю за любую помощь. Спасибо.

Три файла были загружены в здесь .

Показать некоторый код:

        byte[] templateBytes = System.IO.File.ReadAllBytes(TEMPLATE_YANG_FILE);
        using (MemoryStream templateStream = new MemoryStream())
        {
            templateStream.Write(templateBytes, 0, (int)templateBytes.Length);

            string guidStr = Guid.NewGuid().ToString();

            using (WordprocessingDocument document = WordprocessingDocument.Open(templateStream, true))
            {
                document.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);

                MainDocumentPart mainPart = document.MainDocumentPart;

                mainPart.Document = new Document();
                Body bd = new Body();

                foreach (DocumentFormat.OpenXml.Wordprocessing.Paragraph clonedParagrph in lst)
                {
                    bd.AppendChild<DocumentFormat.OpenXml.Wordprocessing.Paragraph>(clonedParagrph);

                    clonedParagrph.Descendants<Blip>().ToList().ForEach(blip =>
                    {
                        var newRelation = document.CopyImage(blip.Embed, this.wordDocument);
                        blip.Embed = newRelation;
                    });

                    clonedParagrph.Descendants<DocumentFormat.OpenXml.Vml.ImageData>().ToList().ForEach(imageData =>
                    {
                        var newRelation = document.CopyImage(imageData.RelationshipId, this.wordDocument);
                        imageData.RelationshipId = newRelation;
                    });
                }

                mainPart.Document.Body = bd;
                mainPart.Document.Save();
            }

            string subDocFile = System.IO.Path.Combine(this.outDir, guidStr + ".docx");
            this.subWordFileLst.Add(subDocFile);

            File.WriteAllBytes(subDocFile, templateStream.ToArray());
        }

lst содержит пункт, клонированный из оригинального документа используя:

(DocumentFormat.OpenXml.Wordprocessing.Paragraph)p.Clone();

1 Ответ

0 голосов
/ 13 февраля 2020

Используя инструмент повышения производительности, обнаружил, что oleobjectx.bin не скопирован, поэтому я добавляю ниже код после копирования Blip и ImageData:

clonedParagrph.Descendants<OleObject>().ToList().ForEach(ole =>
{
    var newRelation = document.CopyOleObject(ole.Id, this.wordDocument);
    ole.Id = newRelation;
});

Решена проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...