将 / Embed转换为aw:drawing

我有一个V:Shape我假设的V:Shape来自.Doc文件转换为.Docx文件,但在我编写的代码中,我想要一个DocumentFormat.OpenXml.Drawing.Pictures.Picture

有没有办法以编程方式转换为Picture

我正在使用的片段是:

  foreach (var item in value) { if (!item.Descendants().Any()) //pictures are processed differently - they're an absolute s**t storm to code... { p.Append(item.CloneNode(true)); } else { p.Append(CreateImageRun(source, item, target, f)); } } public Run CreateImageRun(WordprocessingDocument sourceDoc, Run sourceRun, WordprocessingDocument target, FooterPart footerPart) { ImagePart newPart = footerPart.AddImagePart(ImagePartType.Png); ImageData shape = sourceRun.Descendants().FirstOrDefault(); ImagePart p = sourceDoc.MainDocumentPart.GetPartById(shape.RelationshipId) as ImagePart; Bitmap image = new Bitmap(p.GetStream()); using (Stream s = p.GetStream()) { s.Position = 0; newPart.FeedData(s); } string partId = footerPart.GetIdOfPart(newPart); Drawing newImage = CreateImage(partId); return new Run(newImage); } private Drawing CreateImage(string relationshipId) { // Define the reference of the image. return new Drawing( new DW.Inline( new DW.Extent() { Cx = 990000L, Cy = 792000L }, new DW.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L }, new DW.DocProperties() { Id = (UInt32Value)1U, Name = "Picture 1" }, new DW.NonVisualGraphicFrameDrawingProperties( new A.GraphicFrameLocks() { NoChangeAspect = true }), new A.Graphic( new A.GraphicData( new PIC.Picture( new PIC.NonVisualPictureProperties( new PIC.NonVisualDrawingProperties() { Id = (UInt32Value)0U, Name = "New Bitmap Image.jpg" }, new PIC.NonVisualPictureDrawingProperties()), new PIC.BlipFill( new A.Blip( new A.BlipExtensionList( new A.BlipExtension() { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" }) ) { Embed = relationshipId, CompressionState = A.BlipCompressionValues.Print }, new A.Stretch( new A.FillRectangle())), new PIC.ShapeProperties( new A.Transform2D( new A.Offset() { X = 0L, Y = 0L }, new A.Extents() { Cx = 990000L, Cy = 792000L }), new A.PresetGeometry( new A.AdjustValueList() ) { Preset = A.ShapeTypeValues.Rectangle })) ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" }) ) { DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U, EditId = "50D07946" }); } 

完整的代码上下文在这里有一个不同的问题:

创建ImagePart不会在OpenXML中保存关系

我发现了一种快速/简单的方法 – 我应该早点解决它!

Shape对象有一个ImageData对象作为后代,所以我检查了它,并通过一个额外的方法运行它来获取ImagePart

 A.Blip pic = item.Descendants().FirstOrDefault(); ImageData imageData = item.Descendants().FirstOrDefault(); if (pic == null && imageData == null) //pictures are processed differently - they're an absolute s**t storm to code... { runToAmend.InsertAfterSelf(item.CloneNode(true)); } else { if(pic != null) { runToAmend.InsertAfterSelf(CreateImageFromBlip(source, item, footerHeaderPart,pic)); } else if (imageData != null) { runToAmend.InsertAfterSelf(CreateImageFromShape(source, item, footerHeaderPart, imageData)); } } 

然后创建了一个新方法 – CreateImageFromShape(..) ,然后调用原始的CreateImageRun。

 private Run CreateImageFromShape(WordprocessingDocument sourceDoc, Run sourceRun, OpenXmlPart headerFooterPart, ImageData imageData) { ImagePart p = sourceDoc.MainDocumentPart.GetPartById(imageData.RelationshipId) as ImagePart; return CreateImageRun(sourceDoc, sourceRun, headerFooterPart, p); } 

任务完成。