简体   繁体   English

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

[英]Insert picture to header of Word document with OpenXML

I know that there was same question here , however answers are kinda vague and do not show the full source code.我知道这里有同样的问题,但是答案有点模糊,没有显示完整的源代码。 I've got a method for generating a header, but it does not work(shows x on the image place).我有一种生成标题的方法,但它不起作用(在图像位置显示 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;
    }

Maybe someone dealt with hit?也许有人处理过打击?

Sorry if it was not clear on my previous answer (in linked question).抱歉,如果我之前的回答不清楚(在链接问题中)。 I will try to make this one less vague.我会尽量使这一点不那么模糊。

To insert an image in a header, you must add an ImagePart to the HeaderPart , not to the mainDocumentPart .要在标题中插入图像,您必须将ImagePart添加到HeaderPart ,而不是添加到mainDocumentPart

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();
        }
    }
}

A small share if like me you have only one picture on your header to replace by proper logo一小部分,如果像我一样,您的标题上只有一张图片可以替换为适当的徽标

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 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM