openxml
Insertar imagen en una "forma en línea" en línea en documentos de Word
Buscar..
Introducción
Inserte una imagen en un documento de MS Word con formas tales como rectángulos y óvalos.
Esta documentación asume que sabe cómo insertar una imagen en un documento de Word, abrir y cerrar un documento de Word con OpenXML
Agregue los siguientes espacios de nombres OpenXML a su clase
using System;
using System.Collections.Generic;
using System.Linq;
using DocumentFormat.OpenXml;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;
using DocumentFormat.OpenXml.Drawing.Wordprocessing;
using Wps = DocumentFormat.OpenXml.Office2010.Word.DrawingShape;
Abra el documento y agregue el objeto imagePart para hacer referencia a la imagen que desea insertar en la forma
Ahora abra el documento con OpenXML, debe agregar una imagePart que haga referencia al objeto de imagen al objeto MainDocumentPart usando una secuencia de archivos y obtener el ID de la imagen
string temp;
MainDocumentPart mainPart = document.MainDocumentPart;
ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Bmp);
using (FileStream stream = new FileStream(barcodepath, FileMode.Open))
{
imagePart.FeedData(stream);
}
temp = mainPart.GetIdOfPart(imagePart);
Obtener una referencia de un objeto Blip
En la oficina OpenXML, una imagen que se inserta en un documento de Word se considera un objeto o elemento "Blip". La clase se deriva de DocumentFormat.OpenXml.Drawing Blip debe tener un valor Incrustado que sea un ID de imagePart. El objeto Blip luego va dentro de un objeto / elemento BlipFill , y eso también va dentro de un objeto / elemento graphicData y, a su vez, va a un elemento objeto gráfico . Estoy seguro de que ya te has dado cuenta de que todo funciona como un árbol XML. Muestra el árbol XML abierto a continuación.
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
<wps:wsp>
<wps:cNvSpPr>
<a:spLocks noChangeArrowheads="1" />
</wps:cNvSpPr>
<wps:spPr bwMode="auto">
<a:xfrm>
<a:off x="0" y="0" />
<a:ext cx="1234440" cy="1234440" />
</a:xfrm>
<a:prstGeom prst="roundRect">
<a:avLst>
<a:gd name="adj" fmla="val 16667" />
</a:avLst>
</a:prstGeom>
<a:blipFill dpi="0" rotWithShape="1">
<a:blip r:embed="Raade88ffea8d4c1b" />
<a:stretch>
<a:fillRect l="10000" t="10000" r="10000" b="10000" />
</a:stretch>
</a:blipFill>
</wps:spPr>
<wps:bodyPr rot="0" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" anchor="t" anchorCtr="0" upright="1">
<a:noAutofit />
</wps:bodyPr>
</wps:wsp>
</a:graphicData>
</a:graphic>
Agregando referencia de la imagen las formas en el documento de plantilla.
Ahora tienes una referencia de la imagen. Inserte la imagen en las formas en el documento de la plantilla. Para hacer esto, tendrá que usar algo de LINQ para iterar a través del documento y obtener una referencia a todas las formas en el documento. El elemento wps: spPr que ve en el código XML anterior es el elemento xml para las formas en un documento. La clase C # equivalente es WordprocessingShape
IEnumerable<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape> shapes2 = document.MainDocumentPart.document.Body.Descendants<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape>();
Con una referencia de colección de todas las formas, recorre la colección.
Ahora que tiene una colección de todas las referencias de formas en el documento. Recorra la colección con un foreach y, a través de cada iteración, cree un objeto Blip. Establezca el valor de incrustación del objeto Blip en la referencia de ID de imagen que capturó anteriormente desde la parte de la imagen. También cree un objeto Estirar y un objeto FillRectangle (estos no son realmente necesarios, solo se usan para la alineación correcta de la imagen). Y agregue cada uno a su objeto principal como el equivalente del árbol XML.
foreach (DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape sp in shapes2)
{
//Wps.ShapeProperties shapeProperties1 =
A.BlipFill blipFill1 = new A.BlipFill() { Dpi = (UInt32Value)0U, RotateWithShape = true };
A.Blip blip1 = new A.Blip() { Embed = temp };
A.Stretch stretch1 = new A.Stretch();
A.FillRectangle fillRectangle1 = new A.FillRectangle() { Left = 10000, Top = 10000, Right = 10000, Bottom = 10000 };
Wps.WordprocessingShape wordprocessingShape1 = new Wps.WordprocessingShape();
stretch1.Append(fillRectangle1);
blipFill1.Append(blip1);
blipFill1.Append(stretch1);
Wps.ShapeProperties shapeProperties1 = sp.Descendants<Wps.ShapeProperties>().First();
shapeProperties1.Append(blipFill1);
}