使用 OpenXML 将图片插入 Word 文档的 header
Insert picture to header of Word document with OpenXML
我知道有同样的问题 here,但是答案有点模糊,而且没有显示完整的源代码。我有一个生成 header 的方法,但它不起作用(在图像位置显示 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<HeaderPart>();
var rId = mainDocPart.GetIdOfPart(newHeaderPart);
var headerRef = new HeaderReference { Id = rId };
var sectionProps = doc.MainDocumentPart.Document.Body.Elements<SectionProperties>().LastOrDefault();
if(sectionProps == null) {
sectionProps = new SectionProperties();
doc.MainDocumentPart.Document.Body.Append(sectionProps);
}
sectionProps.RemoveAllChildren<HeaderReference>();
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;
}
也许有人处理了命中?
抱歉,如果我之前的回答(在链接问题中)不清楚。我会尽量让这个不那么模糊。
要在 header 中插入图像,您必须将 ImagePart
添加到 HeaderPart
,而不是 [=13] =].
public static void AddPicHeader(string docxFileName) {
using(WordprocessingDocument doc = WordprocessingDocument.Open(docxFileName, true)) {
var mainDocPart = doc.MainDocumentPart;
// the wrong part
//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<HeaderPart>();
// 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<SectionProperties>().LastOrDefault();
if(sectionProps == null) {
sectionProps = new SectionProperties();
doc.MainDocumentPart.Document.Body.Append(sectionProps);
}
sectionProps.RemoveAllChildren<HeaderReference>();
sectionProps.Append(headerRef);
newHeaderPart.Header = GeneratePicHeader(imagePartID);
newHeaderPart.Header.Save();
}
}
}
如果像我一样你的页眉上只有一张图片需要用适当的徽标替换,那么分享一小部分
Dim HeaderPart As HeaderPart = (From run In wordDoc.MainDocumentPart.HeaderParts Where run.ImageParts.Count = 1 Select run).FirstOrDefault
If HeaderPart IsNot Nothing Then
Dim ImagePart As ImagePart = HeaderPart.ImageParts(0)
Dim imageBytes() As Byte = File.ReadAllBytes(PathNewImge)
Dim writer As BinaryWriter = New BinaryWriter(ImagePart.GetStream())
writer.Write(imageBytes)
writer.Close()
End If
我知道有同样的问题 here,但是答案有点模糊,而且没有显示完整的源代码。我有一个生成 header 的方法,但它不起作用(在图像位置显示 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<HeaderPart>();
var rId = mainDocPart.GetIdOfPart(newHeaderPart);
var headerRef = new HeaderReference { Id = rId };
var sectionProps = doc.MainDocumentPart.Document.Body.Elements<SectionProperties>().LastOrDefault();
if(sectionProps == null) {
sectionProps = new SectionProperties();
doc.MainDocumentPart.Document.Body.Append(sectionProps);
}
sectionProps.RemoveAllChildren<HeaderReference>();
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;
}
也许有人处理了命中?
抱歉,如果我之前的回答(在链接问题中)不清楚。我会尽量让这个不那么模糊。
要在 header 中插入图像,您必须将 ImagePart
添加到 HeaderPart
,而不是 [=13] =].
public static void AddPicHeader(string docxFileName) {
using(WordprocessingDocument doc = WordprocessingDocument.Open(docxFileName, true)) {
var mainDocPart = doc.MainDocumentPart;
// the wrong part
//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<HeaderPart>();
// 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<SectionProperties>().LastOrDefault();
if(sectionProps == null) {
sectionProps = new SectionProperties();
doc.MainDocumentPart.Document.Body.Append(sectionProps);
}
sectionProps.RemoveAllChildren<HeaderReference>();
sectionProps.Append(headerRef);
newHeaderPart.Header = GeneratePicHeader(imagePartID);
newHeaderPart.Header.Save();
}
}
}
如果像我一样你的页眉上只有一张图片需要用适当的徽标替换,那么分享一小部分
Dim HeaderPart As HeaderPart = (From run In wordDoc.MainDocumentPart.HeaderParts Where run.ImageParts.Count = 1 Select run).FirstOrDefault
If HeaderPart IsNot Nothing Then
Dim ImagePart As ImagePart = HeaderPart.ImageParts(0)
Dim imageBytes() As Byte = File.ReadAllBytes(PathNewImge)
Dim writer As BinaryWriter = New BinaryWriter(ImagePart.GetStream())
writer.Write(imageBytes)
writer.Close()
End If