简体   繁体   English

如何将图像插入OpenXML Word文档的标题?

[英]How to insert image into header of OpenXML Word document?

My OpenXML Word document generation project requires text, tables, and images. 我的OpenXML Word文档生成项目需要文本,表格和图像。 But first, I need a document header with a logo (image) in it. 但首先, 我需要一个带有徽标(图像)的文档标题。

I've used the Microsoft example for creating headers and footers at Generating Documents with Headers and Footers in Word 2007 by Using the Open XML SDK 2.0 for Microsoft Office , and text headers work just fine, but the images show up in the header with the broken image icon, a correctly sized border , and the message "This image cannot currently be displayed." 我已经使用Microsoft示例通过使用Open XML SDK 2.0 for Microsoft Office在Word 2007中使用页眉和页脚生成文档创建页眉和页脚,文本标题工作正常,但图像显示在标题中损坏的图像图标, 正确大小的边框 ,以及消息“此图像当前无法显示”。 Also, I can load the selected image into the document body just fine. 此外,我可以将选定的图像加载到文档正文中。 Here's how I create the ImagePart: 以下是我创建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);

The images are loaded with a LoadImage method, derived from the Microsoft example, but adding parameters for width and height, and returning a Drawing object: 图像使用从Microsoft示例派生的LoadImage方法加载,但添加宽度和高度参数,并返回Drawing对象:

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

Using this, the following code works, loading an image anywhere into the body I want: 使用此代码,以下代码可以正常工作,将图像加载到我想要的正文中:

Paragraph paraImage = new Paragraph(new Run(LoadImage(_genomeImageRel, _genomeImageFilename, "name" + _genomeImageRel, 7.5, 2.925)));
body.AppendChild(paraImage);

And the following code does not work to put a logo image in the header: 并且以下代码无法在标头中放置徽标图像:

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

I suspect I'm doing something very subtle incorrectly, because I can load the image anywhere but in the header. 我怀疑我做的事情非常微妙,因为我可以将图像加载到标题中的任何位置。 Can anyone advise? 任何人都可以建议吗?

I suspect I'm doing something very subtle incorrectly, because I can load the image anywhere but in the header. 我怀疑我做的事情非常微妙,因为我可以将图像加载到标题中的任何位置。

If you are able to insert an image into main document, you can also insert an image in header or footer with this code ( private static Drawing LoadImage ). 如果您能够将图像插入主文档,您还可以使用此代码在页眉或页脚中插入图像( private static Drawing LoadImage )。

The only one difference is where you add the ImagePart : 唯一的区别是您添加ImagePart

  • to insert an image in the body of the document, you add an ImagePart to the MainDocumentPart : 要在文档正文中插入图像,请将ImagePart添加到MainDocumentPart

     _agLogoPart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg); ... _agLogoRel = mainDocumentPart.GetIdOfPart(_agLogoPart); 
  • to insert an image in a header , you need add an ImagePart to the HeaderPart that you use to create the header 要在标题中插入图像,您需要将ImagePart添加到用于创建标题的HeaderPart

     _agLogoPart = headerPart.AddImagePart(ImagePartType.Jpeg); ... _agLogoRel = headerPart.GetIdOfPart(_agLogoPart); 
  • to insert an image in a footer , you need add an ImagePart to the FooterPart that you use to create the footer: 要在页脚中插入图像,您需要将ImagePart添加到用于创建页脚的FooterPart

     _agLogoPart = footerPart.AddImagePart(ImagePartType.Jpeg); ... _agLogoRel = footerPart.GetIdOfPart(_agLogoPart); 

Related: 有关:

Please try the following code: 请尝试以下代码:

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

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

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