Вставка графического содержимого из Rest API в текущий открытый документ в Microsoft Word - PullRequest
0 голосов
/ 14 декабря 2018

Редактировать: текст этого вопроса был изменен, чтобы отразить использование открытого XML-кода и взаимодействия.

Я пытаюсь вставить закодированное изображение в формате 64 в документ Word через ленту.Следующий код предназначен для целей воспроизведения:

   public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {
        }

        private void InsertPicture_Click(object sender, RibbonControlEventArgs e)
        {
            Word.Application wordApp = null;
            Word.Document currentDocument = null;
            Word.ContentControls controls = null;
            try
            {
                wordApp = (Word.Application) Marshal.GetActiveObject("Word.Application");
                currentDocument = wordApp.ActiveDocument;
                controls = currentDocument.ContentControls;

                currentDocument.Range().InsertXML(@"<pkg:package xmlns:pkg=""http://schemas.microsoft.com/office/2006/xmlPackage"">
  <pkg:part pkg:name=""/word/media/image1.png"" pkg:contentType=""image/png"" pkg:compression=""store"">
    <pkg:binaryData>iVBORw0KGgoAAAANSUhEUgAAABEAAAAKCAIA
      AADdHiL1AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAVSURBVChTY3gro0IqGtUz3PTIqAAAlO/H4+qBWxcAAAAASUVORK5CYII=</pkg:binaryData>
  </pkg:part></pkg:package>");
                object tr = true;
                object fa = false;
            }
            catch(Exception ex)
            {
                wordApp.ActiveDocument.Range().InsertAfter(ex.Message);
            }
            finally
            {
                if (controls != null) Marshal.ReleaseComObject(controls); controls = null;
                if (currentDocument != null) Marshal.ReleaseComObject(currentDocument); currentDocument = null;
                if (wordApp != null) Marshal.ReleaseComObject(wordApp); wordApp = null;
            }
        }
    }

Однако всякий раз, когда я выполняю этот код, я нажимаю на уловку, и возникает ошибка: «XML-разметка не может быть вставлена ​​в указанное место».Я знаю, что эта ошибка вводит в заблуждение, потому что, если я изменяю xml на <Test>Test</Text>, я вижу «Test» в моем документе.Кто-нибудь может пролить свет на это?

Обратите внимание, что используемое изображение представляет собой просто красный квадрат размером примерно 10px x 10px

1 Ответ

0 голосов
/ 17 декабря 2018

Вам понадобится изображение, которое будет доступно в файловой системе, и вам нужно будет использовать Shapes.AddPicture метод объекта ActiveDocument.Вы можете установить местоположение изображения и его размер при вызове этого метода.

currentDocument.Shapes.AddPicture (imagePath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 10, 10, 250, 250);

Обратитесь к этому URL для получения дополнительной информации:

https://docs.microsoft.com/en-us/office/vba/api/word.shapes.addpicture

Вот рабочий код:

private void InsertPicture_Click(object sender, RibbonControlEventArgs e)
{
    Word.Application wordApp = null;
    Word.Document currentDocument = null;
    Word.ContentControls controls = null;
    try
    {
        wordApp = (Word.Application) Marshal.GetActiveObject ("Word.Application");
        currentDocument = wordApp.ActiveDocument;
        controls = currentDocument.ContentControls;
        string imagePath = @"D:\WordAddInTest\App_Data\Yay.jpg";
        currentDocument.Shapes.AddPicture (imagePath, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 10, 10, 250, 250);


        //              currentDocument.Range ().InsertXML (@"<pkg:package xmlns:pkg=""http://schemas.microsoft.com/office/2006/xmlPackage"">
        //<pkg:part pkg:name=""/word/media/image1.png"" pkg:contentType=""image/png"" pkg:compression=""store"">
        //  <pkg:binaryData>iVBORw0KGgoAAAANSUhEUgAAABEAAAAKCAIA
        //    AADdHiL1AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAVSURBVChTY3gro0IqGtUz3PTIqAAAlO/H4+qBWxcAAAAASUVORK5CYII=</pkg:binaryData>
        //</pkg:part></pkg:package>");
        object tr = true;
        object fa = false;
    }
    catch (Exception ex)
    {
        wordApp.ActiveDocument.Range ().InsertAfter (ex.Message);
    }
    finally
    {
        if (controls != null) Marshal.ReleaseComObject (controls); controls = null;
        if (currentDocument != null) Marshal.ReleaseComObject (currentDocument); currentDocument = null;
        if (wordApp != null) Marshal.ReleaseComObject (wordApp); wordApp = null;
    }
}

Выход получен скод выше:

enter image description here

Надеюсь, это поможет!

...