【问题标题】:How to insert image into header of OpenXML Word document?如何将图像插入 OpenXML Word 文档的标题?
【发布时间】:2013-07-18 14:23:24
【问题描述】:

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

我使用 Microsoft 示例来创建页眉和页脚 Generating Documents with Headers and Footers in Word 2007 by Using the Open XML SDK 2.0 for Microsoft Office,文本标题工作得很好,但图像显示在标题中,带有损坏的图像图标、大小正确的边框和消息“此图像当前无法显示”。另外,我可以将所选图像加载到文档正文中。下面是我创建 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);

图像使用 LoadImage 方法加载,源自 Microsoft 示例,但添加了宽度和高度参数,并返回一个绘图对象:

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

我怀疑我做错了一些非常微妙的事情,因为我可以在除标题之外的任何地方加载图像。谁能给点建议?

【问题讨论】:

  • 您好,能否请您显示将图像插入 Word 文档标题的完整代码?谢谢

标签: c# image insert openxml openxml-sdk


【解决方案1】:

我怀疑我做错了一些非常微妙的事情,因为我可以 将图像加载到除标题之外的任何位置。

如果您能够在主文档中插入图像,您还可以使用此代码 (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);
    

相关:

【讨论】:

  • 您好,您有在 docx header 中插入图片的完整源代码吗?如果是的话,你能分享一下吗?真的很挣扎。谢谢!
【解决方案2】:

请尝试以下代码:

Bitmap image = new Bitmap(imagePath);
SdtElement controlBlock = doc.MainDocumentPart.HeaderParts.First().Header.Descendants<SdtElement>().Where
                                (r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName).SingleOrDefault();
 //find the Blip element of the content control
 Blip blip = controlBlock.Descendants<Blip>().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);

【讨论】:

    【解决方案3】:
    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<HeaderPart>();
                var DefaultHeaderPart = mainDocPart.AddNewPart<HeaderPart>();
                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<SectionProperties>().LastOrDefault();
                if (sectionProps == null)
                {
                    sectionProps = new SectionProperties();
                    mainDocPart.Document.Body.Append(sectionProps);
                }
                sectionProps.RemoveAllChildren<HeaderReference>();        
                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;
            }
    

    【讨论】:

    • 在答案中添加一些描述
    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多