Search code examples
c#ms-wordoffice-interopoffice-automationword-automation

How to insert picture in Word from Base64 encoded image


I have a Base64 encoded image that looks like the following:

var base64SignatureImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOgAAACJCAMAAAAR34S1AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURQAAAA8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/M6GAAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGHRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjb8jGPfAAALWklEQVR4Xu2da6Ojqg6GQVFREdb//7PdCSAXwUsLtp211/thH6fTaX0ghCTEHvL4n+gP9LfpD/S36Q/0t+kP9LfpDzSvhXcNQVHGF/vav6FnQFWPkJRpUUKYsH/xL+g6qGBAOUzK/vEhx4b09vof0FVQxSlpPaXRRP8d0ougM2La60BLM9irezWVL5JLoKoDo7XXsRb6DpfUk8Zeva4roEtL6Gyvtxo7e3GjJnAOxVN6AXShhG0Wp5cg0l7dJ0rGoXiJnIMC54HLEeVjfaYJlo1s7R9e1imoojvL02ig9uI+tRTsqXiRnoIyMtqrrJrbNxipB5qVOr0zUE6YvcqK379EzVfw0hVyAqoo2s2uFsrt1X1q9fK8G3Qke/sKaqb3by7KLB2eCVee0gloc2S4I2mPpruOJrM4eKnpHIPOBxMqWtLdz/nojL/lR5Z1Rcegw94KVTNEhaXWdEnUbG43r1GWXYNqBErC7w+JQGtAcjMoyayMpYOcm3Rvqi9wYmxquBk0CRYUFhna4W1lFGa94X60fVEnoKUuoFirTd0cAr4hHjiWsEMtbwZlny6VjNYXjcU3cgz6htzkWL0BVeWmdQy6fGqRKjFzrouqLdZWm8NU8ZKOQR9NebHmWcmZAx9lHDSYKjLuZ33hkJ+AYnb/Rqm5B6hmGG0wMtqv74G0MBA7AX00x3l3VWFYCZTB1HXEbNgNLNG5KYoZzkCXlrTviQ4gSSBNH8PYlbPokFsVed4zUAzCSH9/WCthNtl2GZoqCliu8bmixHjPQfEebg8cloZkLHMylquoHegSf3EBVFtVc+s+s1Nq7E2Rc1pzqBLbvQSKnuDW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";

Using the Word Automation API, how can I insert this as a picture in a Word document in memory?

Preferably without use of system clipboard, or inserting from file.


Solution

  • The only possibility to insert a graphic from base64 is to use Word Open XML.

    In order to do this via the APIs you need to generate valid Word Open XML in the OPC flat-file format. This can be inserted into the document open in the Word application using the Range.InsertXML method.

    The easiest way to determine what the valid Word Open XML is, is to write it out to a string using the Range.WordOpenXML property. For example, insert the image as an InlineShape then Document.InlineShapes[index].Range.WordOpenXML;

    Or, using the the Immediate Window in the VBA editor and writing it to the current Selection in the document:

    Selection.Text = ActiveDocument.InlineShapes(1).Range.WordOpenXML
    

    then press Enter.

    You should see the image as base64 in the XML.

    This generates the full, complete Word Open XML and you can use it "as is", substituting the base64 (and possibly adjusting size properties). But you don't need all of that for InsertXML. If you'd like to trim it down, or understand more about what's going on, this article explains what the minimum requirements are and provides more background information:

    https://msdn.microsoft.com/en-us/library/office/dn423225.aspx