openxml
Wstaw obraz do wbudowanego „wbudowanego kształtu” w dokumentach tekstowych
Szukaj…
Wprowadzenie
Wstaw obraz do kształtów dokumentu MS Word, takich jak prostokąty i owale.
Ta dokumentacja zakłada, że wiesz, jak wstawić obraz do dokumentu tekstowego, otwierać i zamykać dokument tekstowy za pomocą OpenXML
Dodaj następujące przestrzenie nazw OpenXML do swojej klasy
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;
Otwórz dokument i dodaj obiekt imagePart, aby odwoływał się do obrazu, który chcesz wstawić do kształtu
Teraz otwórz dokument za pomocą OpenXML, musisz dodać imagePart, który odwołuje się do obiektu obrazu do obiektu MainDocumentPart za pomocą strumienia plików i uzyskać identyfikator obrazu
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);
Uzyskaj odniesienie do obiektu Blip
W pakiecie Office OpenXML obraz wstawiany do dokumentu tekstowego jest uważany za obiekt lub element „Blip”. Klasa pochodzi od DocumentFormat.OpenXml.Drawing Blip musi mieć wartość Embed, która jest identyfikatorem imagePart. Następnie obiekt Blip wchodzi do obiektu / elementu BlipFill , który również wchodzi do obiektu / elementu graphicData, a ten z kolei przechodzi do elementu obiektu graficznego . Jestem już prawie pewien, że zdałeś sobie sprawę, że wszystko działa jak drzewo XML. Przykładowe otwarte drzewo XML poniżej.
<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>
Dodanie odwołania do obrazu kształtów w dokumencie szablonu.
Teraz masz odniesienie do obrazu. Wstaw obraz do kształtów w dokumencie szablonu. Aby to zrobić, będziesz musiał użyć LINQ do iteracji w dokumencie i uzyskać odniesienie do wszystkich kształtów w dokumencie. Element wps: spPr widoczny w powyższym kodzie XML jest elementem xml dla kształtów w dokumencie. Odpowiednikiem klasy C # jest WordprocessingShape
IEnumerable<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape> shapes2 = document.MainDocumentPart.document.Body.Descendants<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.WordprocessingShape>();
Z odniesieniem do kolekcji wszystkich kształtów, przeglądaj kolekcję.
Teraz, gdy masz kolekcję wszystkich odniesień do kształtów w dokumencie. Pętlę przez kolekcję z foreach i przez każdą iterację utwórz obiekt Blip. Ustaw wartość osadzania obiektu Blip na odniesienie do identyfikatora obrazu, które zostało przechwycone wcześniej z części obrazu. Utwórz także obiekt Stretch i obiekt FillRectangle (nie są one tak naprawdę konieczne, są po prostu używane do prawidłowego wyrównania obrazu). I dołączaj każdy do jego obiektu nadrzędnego, jak ekwiwalent drzewa 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);
}