Установить форму / линейную форму как Декоративное в Word - PullRequest
0 голосов
/ 29 октября 2018

В Office 365 Microsoft представила новое свойство для Shapes / InlineShapes (рисунки): Decorative

Я могу манипулировать им, используя VBA, как показано здесь, но не , используя VSTO, что мне действительно нужно.

Тип значения - Microsoft.Office.Core.MsoTriState, и если установлено значение msoTrue, оно включает функцию на изображении.

Мне удалось легко переключить эту функцию с помощью VBA, как показано здесь (чтобы попробовать, просто вставьте встроенное изображение в пустой документ в Microsoft Word 365)

Sub ToggleDecorativePic()
    Dim pic As InlineShape
    Set pic = ActiveDocument.InlineShapes(1)
    pic.Decorative = Not pic.Decorative
End Sub

Это переключит свойство Декоративность первого InLineShape в активном документе.

Before code executed

After code executed

Но вот актуальная проблема:

Мне нужно сделать это с VSTO (C# или VB.NET), но свойство .Decorative недоступно в Intellisense, и даже если я попытаюсь принудительно вызвать его, введя объект InlineShape в Dynamic, он просто падает при выполнении кода.

Я использую этот пакет Office Interop nuGet для взаимодействия с Word: Bundle.Microsoft.Office.Interop версия 15.0.4569 от October 23rd 2018, поэтому она должна быть актуальной. Пакет содержит ресурсы Interop для Microsoft Excel, Outlook, PowerPoint и Word .

Я также пытался использовать Microsoft.Office.Interop.Word, но ему около двух лет, так что, очевидно, он также не содержит этой новой функции.

Я надеюсь, что кто-то может помочь мне в правильном направлении.

С новыми законами ЕС, касающимися доступных документов, это критическая функция при создании документов PDF с использованием Microsoft Word.

Альтернативно: возможно ли динамически выполнить это как VBA как-нибудь, начиная с VSTO, без создания макросов в документе и т. Д.? Я предполагаю, что нет, по крайней мере, без включения доверия к объектной модели, что просто неосуществимо: - /

1 Ответ

0 голосов
/ 29 октября 2018

Интересная проблема, действительно. Сначала я подумал, что это, возможно, можно решить, установив ссылку на Microsoft.Office.Interop.Word на PIA в GAC, а не на те, которые установлены Visual Studio (который является источником по умолчанию для проекта VSTO), и установив «embed interop types» ложно. Оба не имели никакого эффекта, однако.

Это оставило только возможность использования PInvoke, который работал для меня:

    Word.InlineShape ils = doc.InlineShapes[1];

    object oIls = ils;
    object isDec = oIls.GetType().InvokeMember("Decorative", System.Reflection.BindingFlags.GetProperty, null, oIls, null);

    System.Diagnostics.Debug.Print("Is the InlineShape marked as decorative: " + isDec.ToString());

    if ((int)isDec != -1)
    {
        object[] arg = new object[] { -1 };
        oIls.GetType().InvokeMember("Decorative", System.Reflection.BindingFlags.SetProperty, null, oIls, arg);
    }
...