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

时间:2017-06-20 09:12:01

标签: c# ms-word openxml openxml-sdk

我知道有同样的问题here,但答案有点模糊,并没有显示完整的源代码。我有一个生成标题的方法,但它不起作用(在图像位置显示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;
    }

也许有人处理了打击?

2 个答案:

答案 0 :(得分:2)

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

要在标题中插入图片,您必须将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<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();
        }
    }
}

答案 1 :(得分:0)

如果像我这样的小份额,您的标头上只有一张图片可以替换为适当的徽标

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