Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将图像插入到OpenXML Word文档的标题中?_C#_Image_Insert_Openxml_Openxml Sdk - Fatal编程技术网

C# 如何将图像插入到OpenXML Word文档的标题中?

C# 如何将图像插入到OpenXML Word文档的标题中?,c#,image,insert,openxml,openxml-sdk,C#,Image,Insert,Openxml,Openxml Sdk,我的OpenXML Word文档生成项目需要文本、表格和图像。但首先,我需要一个带有徽标(图像)的文档标题。 我使用了Microsoft的示例在以下位置创建页眉和页脚: ,文本标题工作正常,但图像在标题中显示为断开的图像图标、大小正确的边框以及消息“当前无法显示此图像”。此外,我可以将所选图像加载到文档正文中。以下是创建ImagePart的方法: // Create AG logo part. _agLogoPart = mainDocumentPart.AddImagePart(ImagePa

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

我使用了Microsoft的示例在以下位置创建页眉和页脚: ,文本标题工作正常,但图像在标题中显示为断开的图像图标、大小正确的边框以及消息“当前无法显示此图像”。此外,我可以将所选图像加载到文档正文中。以下是创建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;
}

我怀疑我做了一些非常微妙的错误,因为我可以加载图像的任何地方,但在标题。有人能提供建议吗?

请尝试以下代码:

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);
Bitmap image=新位图(imagePath);
SdtElement controlBlock=doc.MainDocumentPart.HeaderParts.First().Header.Descendants()。其中
(r=>r.SdtProperties.GetFirstChild().Val==标记名).SingleOrDefault();
//查找内容控件的Blip元素
Blip Blip=controlBlock.subjects().FirstOrDefault();
//添加图像并更改嵌入的id
ImagePart ImagePart=doc.MainDocumentPart.AddImagePart(ImagePartType.Jpeg);
使用(MemoryStream stream=new MemoryStream())
{
保存(流,ImageFormat.Jpeg);
流位置=0;
imagePart.FeedData(流);
}
blip.Embed=doc.MainDocumentPart.GetIdOfPart(imagePart);
我怀疑我做错了一些非常微妙的事情,因为我可以 将图像加载到头以外的任何位置

如果能够在主文档中插入图像,还可以使用此代码(
private static Drawing LoadImage
)在页眉或页脚中插入图像

唯一的区别是添加了
ImagePart

  • 要在文档的正文中插入图像,请将
    ImagePart
    添加到
    MainDocumentPart

    _agLogoPart = mainDocumentPart.AddImagePart(ImagePartType.Jpeg);
    ...
     _agLogoRel = mainDocumentPart.GetIdOfPart(_agLogoPart);
    
  • 要在标题中插入图像,需要将
    图像部分
    添加到用于创建标题的
    标题部分

    _agLogoPart = headerPart.AddImagePart(ImagePartType.Jpeg);
    ...
    _agLogoRel = headerPart.GetIdOfPart(_agLogoPart);
    
  • 要在页脚中插入图像,需要将
    ImagePart
    添加到用于创建页脚的
    FooterPart

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

相关的:

专用静态MainDocumentPart AddHeader(MainDocumentPart mainDocPart)
{
字符串LogoFilename=System.Web.Hosting.HostingEnvironment.MapPath(“~/Content/Images/TemplateLogo.png”);
mainDocPart.DeleteParts(mainDocPart.HeaderParts);
var FirstHeaderPart=mainDocPart.AddNewPart();
var DefaultHeaderPart=mainDocPart.AddNewPart();
var imgPartFirst=FirstHeaderPart.AddImagePart(ImagePartType.Jpeg);
var imagePartFirstID=FirstHeaderPart.GetIdOfPart(imgPartFirst);
var imgPartDefault=FirstHeaderPart.AddImagePart(ImagePartType.Jpeg);
var imagePartDefaultID=FirstHeaderPart.GetIdOfPart(imgPartDefault);
使用(FileStream fs=newfilestream(LogoFilename,FileMode.Open))
{
imgPartFirst.FeedData(fs);
}
使用(FileStream fsD=newfilestream(LogoFilename,FileMode.Open))
{
imgPartDefault.FeedData(fsD);
}
var rIdFirst=mainDocPart.GetIdOfPart(FirstHeaderPart);
var FirstHeaderRef=newheaderreference{Id=rIdFirst,Type=HeaderFooterValues.First};
var ridefault=mainDocPart.GetIdOfPart(DefaultHeaderPart);
var DefaultHeaderRef=newheaderreference{Id=ridefault};
var sectionProps=mainDocPart.Document.Body.Elements().LastOrDefault();
if(sectionProps==null)
{
sectionProps=新的SectionProperties();
mainDocPart.Document.Body.Append(sectionProps);
}
sectionProps.RemoveAllChildren();
FirstHeaderPart.Header=generateFirstPiheader(imagePartFirstID);
DefaultHeaderPart.Header=GeneratePicHeader(imagePartDefaultID);
FirstHeaderPart.Header.Save();
DefaultHeaderPart.Header.Save();
sectionProps.PrependChild(新标题页());
sectionProps.AppendChild(DefaultHeaderRef);
sectionProps.AppendChild(FirstHeaderRef);
返回mainDocPart;
}

Hi,能否显示将图像插入Word文档标题的完整代码?谢谢你好,你有完整的源代码将图片插入docx标题吗?如果是,请分享。真的很挣扎。非常感谢。在答案中添加一些描述
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;
        }