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

我知道这里有同样的问题,但答案有点模糊,并没有显示完整的源代码。 我有一个生成标题的方法,但它不起作用(在图像位置显示x)。

public static void AddPicHeader(string docxFileName) { using(WordprocessingDocument doc = WordprocessingDocument.Open(docxFileName, true)) { var mainDocPart = doc.MainDocumentPart; var imgPart = mainDocPart.AddImagePart(ImagePartType.Png, "rId999"); var image = GetImageFromFile(logoFileName); var imagePartID = mainDocPart.GetIdOfPart(imgPart); GenerateImagePartContent(imgPart, image); if(!mainDocPart.HeaderParts.Any()) { mainDocPart.DeleteParts(mainDocPart.HeaderParts); var newHeaderPart = mainDocPart.AddNewPart(); var rId = mainDocPart.GetIdOfPart(newHeaderPart); var headerRef = new HeaderReference { Id = rId }; var sectionProps = doc.MainDocumentPart.Document.Body.Elements().LastOrDefault(); if(sectionProps == null) { sectionProps = new SectionProperties(); doc.MainDocumentPart.Document.Body.Append(sectionProps); } sectionProps.RemoveAllChildren(); sectionProps.Append(headerRef); newHeaderPart.Header = GeneratePicHeader(imagePartID); newHeaderPart.Header.Save(); } } } private static Header GeneratePicHeader(string relationshipId) { var element = 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 = "NIS Logo" }, 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 = "nis.png" }, 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" }); var header = new Header(); var paragraph = new Paragraph(); var run = new Run(); run.Append(element); paragraph.Append(run); header.Append(paragraph); return header; } 

也许有人打过打?

对不起,如果我之前的回答不清楚(链接问题)。 我会尽量使这个不那么模糊。

要在标题中插入图像,必须将ImagePart添加到HeaderPart ,而不是添加到mainDocumentPart

 public static void AddPicHeader(string docxFileName) { using(WordprocessingDocument doc = WordprocessingDocument.Open(docxFileName, true)) { //var mainDocPart = doc.MainDocumentPart; //var imgPart = mainDocPart.AddImagePart(ImagePartType.Png, "rId999"); //var image = GetImageFromFile(logoFileName); //var imagePartID = mainDocPart.GetIdOfPart(imgPart); //GenerateImagePartContent(imgPart, image); if(!mainDocPart.HeaderParts.Any()) { mainDocPart.DeleteParts(mainDocPart.HeaderParts); var newHeaderPart = mainDocPart.AddNewPart(); // try this instead var imgPart = newHeaderPart.AddImagePart(ImagePartType.Png, "rId999"); ^^^^^^^^^^^^^ var image = GetImageFromFile(logoFileName); var imagePartID = newHeaderPart.GetIdOfPart(imgPart); ^^^^^^^^^^^^^ GenerateImagePartContent(imgPart, image); var rId = mainDocPart.GetIdOfPart(newHeaderPart); var headerRef = new HeaderReference { Id = rId }; var sectionProps = doc.MainDocumentPart.Document.Body.Elements().LastOrDefault(); if(sectionProps == null) { sectionProps = new SectionProperties(); doc.MainDocumentPart.Document.Body.Append(sectionProps); } sectionProps.RemoveAllChildren(); sectionProps.Append(headerRef); newHeaderPart.Header = GeneratePicHeader(imagePartID); newHeaderPart.Header.Save(); } } }