ОШИБКА: Word 2013 VSTO не может обрабатывать изображение в заголовке, отформатированное позади или перед текстом

Я публикую этот вопрос из сообщества Microsoft, потому что я не получил там никакого ответа, и, возможно, кто-то здесь может пролить свет на этот вопрос.

Я заметил проблему, характерную для Word 2013, при использовании VSTO для обработки документа.

Документ содержит изображение в верхнем или нижнем колонтитуле, в параметрах макета которого установлено значение «С обтеканием текстом» с «За текстом» или «Перед текстом»:

«Изображение

Используя VSTO, если я открою документ, а затем попытаюсь обработать фигуры, я получу следующее исключение:

The remote procedure call failed. (Exception from HRESULT: 0x800706BE)

Я загрузил копию здесь: Word2013VstoImageFormattedInHeaderBug.zip

Соответствующий фрагмент кода находится в WordFieldEnumerator.cs:

private static bool ShapesWithinGroup(Shape shape)
{
    var result = false;
    try
    {
        // shape.GroupItems throws the exception
        if (shape.GroupItems != null && shape.GroupItems.Count > 0)
        {
            result = true;
        }
    }
    catch (UnauthorizedAccessException)
    {
        // This shape is not in a group - ignore
    }
    catch (Exception exception)
    {
        var exceptionString = exception.BuildExceptionString();
        Console.WriteLine(exceptionString);
        Console.WriteLine(exception.StackTrace);
        //throw;
    }

    return result;
}

Вот полное исключение и трассировка стека:

The remote procedure call failed. (Exception from HRESULT: 0x800706BE)

   at Microsoft.Office.Interop.Word.Shape.get_GroupItems()
   at Word2013VstoImageFormattedInHeaderBug.WordFieldEnumerator.ShapesWithinGroup(Shape shape) in C:\Users\QA\Desktop\Word2013VstoImageFormattedInHeaderBug\Word2013VstoImageFormattedInHeaderBug\WordFieldEnumerator.cs:line 170
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

   at Microsoft.Office.Interop.Word.Shape.get_TextFrame()
   at Word2013VstoImageFormattedInHeaderBug.WordFieldEnumerator.ProcessShapes(IEnumerable`1 shapes) in C:\Users\QA\Desktop\Word2013VstoImageFormattedInHeaderBug\Word2013VstoImageFormattedInHeaderBug\WordFieldEnumerator.cs:line 124
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext()
   at System.Linq.Enumerable.<CastIterator>d__aa`1.MoveNext()
   at Word2013VstoImageFormattedInHeaderBug.WordFieldEnumerator.ProcessShapes(IEnumerable`1 shapes) in C:\Users\QA\Desktop\Word2013VstoImageFormattedInHeaderBug\Word2013VstoImageFormattedInHeaderBug\WordFieldEnumerator.cs:line 90
   at Word2013VstoImageFormattedInHeaderBug.WordFieldEnumerator.GetAllFields() in C:\Users\QA\Desktop\Word2013VstoImageFormattedInHeaderBug\Word2013VstoImageFormattedInHeaderBug\WordFieldEnumerator.cs:line 64
   at Word2013VstoImageFormattedInHeaderBug.Program.LockDialogFields(Document document) in C:\Users\QA\Desktop\Word2013VstoImageFormattedInHeaderBug\Word2013VstoImageFormattedInHeaderBug\Program.cs:line 116
   at Word2013VstoImageFormattedInHeaderBug.Program.PdfDocument(String documentFilePath) in C:\Users\QA\Desktop\Word2013VstoImageFormattedInHeaderBug\Word2013VstoImageFormattedInHeaderBug\Program.cs:line 60

Исключение выдается независимо от того, пытаюсь ли я его перехватить или нет, и оно приводит к сбою Word 2013:

Запись средства просмотра событий

Эта ошибка не возникает в Word 2016, и я могу успешно обрабатывать фигуры. Однако обновление до Office 2016 не вариант. Я считаю, что для исправления ошибки требуется исправление для Office 2013.

Могу ли я что-нибудь сделать, чтобы это работало в Word 2013? Я пробовал множество предполагаемых исправлений, включая несколько исправлений и переустановок Office 2013, но безрезультатно.


person Sameer Singh    schedule 01.05.2017    source источник
comment
1. Вы обновили видеодрайвер? 2. Имеет ли значение отключение антивируса/брандмауэра? 3. Пробовали ли вы переименовать wwlib.dll и делаете ремонт в офисе? 4. Вы не используете это на серверной ОС? 5. верный код для работы с фигурами?   -  person Jeremy Thompson    schedule 04.05.2017
comment
@ Джереми Томпсон 1. Да. 2. Нет. 3. Да. 4. Нет, 64-разрядная версия Windows 10 1511 (сборка ОС 10586.318), 32-разрядная версия Word 2013 15.0.4823.1000 (MSO 15.0.4823.1000), часть Office Standard 2013. 5. Да. Ошибка по-прежнему возникает, и Word по-прежнему аварийно завершает работу. Есть ли что-то еще, что я должен проверить?   -  person Sameer Singh    schedule 05.05.2017
comment
Это все еще происходит, если вы проверяете Type формы вместо того, чтобы ловить исключение, когда это не группа?   -  person Chris    schedule 05.05.2017
comment
@ Крис, хочешь верь, хочешь нет, да. Word 2013 так же вылетает.   -  person Sameer Singh    schedule 08.05.2017


Ответы (2)


Фигуры можно размещать в любом месте на странице, но они всегда привязаны к якорному диапазону текста. Выбор текущего диапазона перед повторением привязанных к нему фигур может устранить исключение HRESULT 0x80010105 RPC_E_SERVERFAULT.

В вашем методе GetAllFields() Select() диапазон верхнего и нижнего колонтитула соответственно перед вызовом ProcessShapes().

foreach (HeaderFooter header in section.Headers)
{
    if (header.LinkToPrevious) // || header.Index != WdHeaderFooterIndex.wdHeaderFooterFirstPage
    {
        continue;
    }

    header.Range.Select();

    // Add the fields in the header
    fields.AddRange(header.Range.Fields.Cast<Field>());

    // Add the fields in the shapes in the header
    var fieldsInShapes = ProcessShapes(header.Shapes.Cast<Shape>());
    fields.AddRange(fieldsInShapes);
}

foreach (HeaderFooter footer in section.Footers)
{
    if (footer.LinkToPrevious) // || footer.Index != WdHeaderFooterIndex.wdHeaderFooterFirstPage
    {
        continue;
    }

    footer.Range.Select();

    // Add the fields in the footer
    fields.AddRange(footer.Range.Fields.Cast<Field>());

    // Add the fields in the shapes in the footer
    var fieldsInShapes = ProcessShapes(footer.Shapes.Cast<Shape>());
    fields.AddRange(fieldsInShapes);
}

Я не знаю, поможет ли это вам? (Я не эксперт Word Interop..)

person Fredrik    schedule 05.05.2017
comment
Это интересно и не очень очевидно, если сосредоточиться на формах, а не на диапазонах. Я сделаю это и дам вам знать, как это происходит. Спасибо за ответ! - person Sameer Singh; 08.05.2017
comment
Я очень рад этому, наш отдел контроля качества предварительно одобрил это исправление для Word 2013! Им просто нужно провести еще несколько тестов, прежде чем официально пометить ошибку как исправленную. Затем я награжу вас заслуженной наградой! Я не могу выразить, насколько я ошеломлен (не говоря уже о том, что он тупой), но это VSTO и COM, поэтому я думаю, что решения такого рода проблем ожидаются вне поля зрения! Спасибо еще раз! - person Sameer Singh; 09.05.2017
comment
Привет Самир. Я думаю, что многие считают, что с Office Interop/VSTO SDK сложно работать, если не сказать больше (включая меня). Я рад, что у вас и команды все снова на правильном пути, и спасибо за награду. Удачного кодирования! / Фредрик - person Fredrik; 09.05.2017

я много работаю над этим после того, как прокомментировал этот код в классе WordFieldEnumerator

  //foreach (Section section in Document.Sections)
            //{
            //    foreach (HeaderFooter header in section.Headers)
            //    {
            //        if (header.LinkToPrevious) // || header.Index != WdHeaderFooterIndex.wdHeaderFooterFirstPage
            //        {
            //            continue;
            //        }
            //        // Add the fields in the header
            //        fields.AddRange(header.Range.Fields.Cast<Field>());

            //        // Add the fields in the shapes in the header
            //        var fieldsInShapes = ProcessShapes(header.Shapes.Cast<Shape>());
            //        fields.AddRange(fieldsInShapes);
            //    }

            //    foreach (HeaderFooter footer in section.Footers)
            //    {
            //        if (footer.LinkToPrevious) // || footer.Index != WdHeaderFooterIndex.wdHeaderFooterFirstPage
            //        {
            //            continue;
            //        }
            //        // Add the fields in the footer
            //        fields.AddRange(footer.Range.Fields.Cast<Field>());

            //        // Add the fields in the shapes in the footer
            //        var fieldsInShapes = ProcessShapes(footer.Shapes.Cast<Shape>());
            //        fields.AddRange(fieldsInShapes);
            //    }
            //}

он работает как можно лучше без ошибок; ошибка в фигурах в верхнем и нижнем колонтитулах, у них проблема с доступом

person Shahrooz Ansari    schedule 08.05.2017
comment
К сожалению, нет, комментирование кода, вызывающего сбой Word 2013, не является исправлением. Извини. - person Sameer Singh; 09.05.2017