openxml
Вставка изображения в встроенную «встроенную форму» в текстовые документы
Поиск…
Вступление
Вставьте изображение в формы документа MS Word, такие как прямоугольники и овалы.
В этой документации предполагается, что вы знаете, как вставить изображение в документ Word, открыть и закрыть документ с использованием OpenXML
Добавьте в свой класс следующие пространства имен OpenXML
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;
Откройте документ и добавьте объект ImagePart для ссылки на изображение, которое вы хотите вставить в форму
Теперь откройте документ с помощью OpenXML, вы должны добавить ImagePart, который ссылается на объект изображения на объект MainDocumentPart, используя поток файлов и получить идентификатор изображения
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);
Получить ссылку на объект Blip
В Office OpenXML изображение, вставленное в текстовый документ, считается объектом или элементом «Blip». Класс получен из документа DocumentFormat.OpenXml.Drawing. Blip должен иметь значение Embed, которое является идентификатором образа. Затем объект Blip входит в объект / элемент BlipFill и также входит внутри объекта / элемента graphicsData и, в свою очередь, переходит в элемент графического объекта. Я почти уверен, что вы поняли, что все работает как дерево XML. Пример дерева Open XML ниже.
<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>
Добавление ссылки на изображение фигур в документе шаблона.
Теперь у вас есть ссылка на изображение. Вставьте изображение в фигуры в документе шаблона. Для этого вам нужно будет использовать LINQ для повторения документа и получения ссылки на все фигуры в документе. Элемент wps: spPr, который вы видите в приведенном выше XML-коде, представляет собой элемент xml для фигур в документе. Эквивалентным классом C # является WordprocessingShape
IEnumerable<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape> shapes2 = document.MainDocumentPart.document.Body.Descendants<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape>();
Со ссылкой на подборку всех фигур, пройдите через коллекцию.
Теперь у вас есть коллекция всех ссылок на фигуры в документе. Прокрутите коллекцию с помощью foreach и через каждую итерацию создайте объект Blip. Установите значение встроенного объекта Blip в ссылку на идентификатор изображения, которую вы перенесли ранее из части изображения. Также создайте объект Stretch и объект FillRectangle (они действительно не нужны, они просто используются для правильного выравнивания изображения). И добавьте каждый к его родительскому объекту, как эквивалент дерева 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);
}