如何将图像插入OpenXML Word文档的标题?

我的OpenXML Word文档生成项目需要文本,表格和图像。 但首先, 我需要一个带有徽标(图像)的文档标题。

我已经使用Microsoft示例通过使用Open XML SDK 2.0 for Microsoft Office在Word 2007中使用页眉和页脚生成文档创建页眉和页脚,文本标题工作正常,但图像显示在标题中损坏的图像图标, 正确大小的边框 ,以及消息“此图像当前无法显示”。 此外,我可以将选定的图像加载到文档正文中。 以下是我创建ImagePart的方法:

// Create AG logo part. _agLogoPart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg); using (FileStream stream = new FileStream(_agLogoFilename, FileMode.Open)) { _agLogoPart.FeedData(stream); } _agLogoRel = mainDocumentPart.GetIdOfPart(_agLogoPart); 

使用从Microsoft示例派生的LoadImage方法加载图像,但添加宽度和高度参数,并返回Drawing对象:

 private static Drawing LoadImage(string relationshipId, string filename, string picturename, double inWidth, double inHeight) { double emuWidth = Konsts.EmusPerInch * inWidth; double emuHeight = Konsts.EmusPerInch * inHeight; var element = new Drawing( new DW.Inline( new DW.Extent { Cx = (Int64Value)emuWidth, Cy = (Int64Value)emuHeight }, new DW.EffectExtent { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L }, new DW.DocProperties { Id = (UInt32Value)1U, Name = picturename }, 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 = filename }, 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 = (Int64Value)emuWidth, Cy = (Int64Value)emuHeight }), 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" }); return element; } 

使用此代码,以下代码可以正常工作,将图像加载到我想要的正文中:

 Paragraph paraImage = new Paragraph(new Run(LoadImage(_genomeImageRel, _genomeImageFilename, "name" + _genomeImageRel, 7.5, 2.925))); body.AppendChild(paraImage); 

并且以下代码无法在标头中放置徽标图像:

 private static Header GeneratePageHeaderPart(string headerText) { Header hdr = new Header(new Paragraph(new Run(LoadImage(_agLogoRel, _agLogoFilename, "name" + _agLogoRel, 2.57, 0.73)))); return hdr; } 

我怀疑我做的事情非常微妙,因为我可以将图片加载到标题中的任何位置。 任何人都可以建议吗?

我怀疑我做的事情非常微妙,因为我可以将图片加载到标题中的任何位置。

如果您能够将图像插入主文档,您还可以使用此代码在页眉或页脚中插入图像( private static Drawing LoadImage )。

唯一的区别是您添加ImagePart

  • 要在文档正文中插入图像,请将ImagePart添加到MainDocumentPart

     _agLogoPart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg); ... _agLogoRel = mainDocumentPart.GetIdOfPart(_agLogoPart); 
  • 要在标题中插入图像,您需要将ImagePart添加到用于创建标题的HeaderPart

     _agLogoPart = headerPart.AddImagePart(ImagePartType.Jpeg); ... _agLogoRel = headerPart.GetIdOfPart(_agLogoPart); 
  • 要在页脚中插入图像,您需要将ImagePart添加到用于创建页脚的FooterPart

     _agLogoPart = footerPart.AddImagePart(ImagePartType.Jpeg); ... _agLogoRel = footerPart.GetIdOfPart(_agLogoPart); 

有关:

  • 使用OpenXML将图片插入Word文档的标题

请尝试以下代码:

 Bitmap image = new Bitmap(imagePath); SdtElement controlBlock = doc.MainDocumentPart.HeaderParts.First().Header.Descendants().Where (r => r.SdtProperties.GetFirstChild().Val == tagName).SingleOrDefault(); //find the Blip element of the content control Blip blip = controlBlock.Descendants().FirstOrDefault(); //add image and change embeded id ImagePart imagePart = doc.MainDocumentPart.AddImagePart(ImagePartType.Jpeg); using (MemoryStream stream = new MemoryStream()) { image.Save(stream, ImageFormat.Jpeg); stream.Position = 0; imagePart.FeedData(stream); } blip.Embed = doc.MainDocumentPart.GetIdOfPart(imagePart); 
 private static MainDocumentPart AddHeader(MainDocumentPart mainDocPart) { string LogoFilename = System.Web.Hosting.HostingEnvironment.MapPath("~/Content/Images/TemplateLogo.png"); mainDocPart.DeleteParts(mainDocPart.HeaderParts); var FirstHeaderPart = mainDocPart.AddNewPart(); var DefaultHeaderPart = mainDocPart.AddNewPart(); var imgPartFirst = FirstHeaderPart.AddImagePart(ImagePartType.Jpeg); var imagePartFirstID = FirstHeaderPart.GetIdOfPart(imgPartFirst); var imgPartDefault = FirstHeaderPart.AddImagePart(ImagePartType.Jpeg); var imagePartDefaultID = FirstHeaderPart.GetIdOfPart(imgPartDefault); using (FileStream fs = new FileStream(LogoFilename, FileMode.Open)) { imgPartFirst.FeedData(fs); } using (FileStream fsD = new FileStream(LogoFilename, FileMode.Open)) { imgPartDefault.FeedData(fsD); } var rIdFirst = mainDocPart.GetIdOfPart(FirstHeaderPart); var FirstHeaderRef = new HeaderReference { Id = rIdFirst, Type = HeaderFooterValues.First }; var rIdDefault = mainDocPart.GetIdOfPart(DefaultHeaderPart); var DefaultHeaderRef = new HeaderReference { Id = rIdDefault }; var sectionProps = mainDocPart.Document.Body.Elements().LastOrDefault(); if (sectionProps == null) { sectionProps = new SectionProperties(); mainDocPart.Document.Body.Append(sectionProps); } sectionProps.RemoveAllChildren(); FirstHeaderPart.Header = GenerateFirstPicHeader(imagePartFirstID); DefaultHeaderPart.Header = GeneratePicHeader(imagePartDefaultID); FirstHeaderPart.Header.Save(); DefaultHeaderPart.Header.Save(); sectionProps.PrependChild(new TitlePage()); sectionProps.AppendChild(DefaultHeaderRef); sectionProps.AppendChild(FirstHeaderRef); return mainDocPart; }