使用Word文档中的Open XML SDK将图像添加到标头是不成功的

时间:2015-03-21 21:00:37

标签: c# openxml

这是我第二次使用OpenXML sdk(2.5)而我正在尝试将图像添加到文档的标题中。但没有任何运气,文件中唯一显示的是我放在身体中的测试文本。我按照MSDN中的说明创建了标题,我有一个这样的辅助函数:

private static DocumentFormat.OpenXml.Wordprocessing.Header GeneratePageHeaderPart(WordprocessingDocument myDoc, string relationshipId)
    {
     string imageFolder = HostingEnvironment.MapPath("~/Images/Docs");
        string[] encabezado = { "logoCideAsistencia.jpg", "logoSegobAsistencia.jpg", "logoPFAsistencia.jpg", "logoDiplomadoAsistencia.jpg" }; 
     var element =
     new DocumentFormat.OpenXml.Wordprocessing.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 = "Picture 1"
         },
         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 = "New Bitmap Image.jpg"
                         },
                         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 DocumentFormat.OpenXml.Wordprocessing.Header();
            var parrafo = new Paragraph();
            var run = new DocumentFormat.OpenXml.Wordprocessing.Run();
            run.Append(element);
            parrafo.Append(run);
            header.Append(parrafo);
            return header;
    }

然后在我的控制器函数中(我正在使用ASP MVC)我这样称呼它:

 public ActionResult PrintHorarioModulo(int IdCurso)
    {

        string document = "HorariodelModulo.docx";
        string uploadsFolder = HostingEnvironment.MapPath("~/App_Data/Docs");
        string imageFolder = HostingEnvironment.MapPath("~/Images/Docs");
        string[] encabezado = { "logoCideAsistencia.jpg", "logoSegobAsistencia.jpg", "logoPFAsistencia.jpg", "logoDiplomadoAsistencia.jpg" };
        string ruta = Path.Combine(uploadsFolder, document);
        using (WordprocessingDocument myDoc = WordprocessingDocument.Create(ruta, WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
            GenerateMainDocumentPart().Save(mainPart);
            var documentSettingsPart =mainPart.AddNewPart<DocumentSettingsPart>("rId1");
            GenerateDocumentSettingsPart().Save(documentSettingsPart);
            var header = mainPart.AddNewPart<HeaderPart>("rId2");
            ImagePart headerImg1 = myDoc.MainDocumentPart.AddImagePart(ImagePartType.Jpeg);
            string ruta_imagen = Path.Combine(imageFolder, encabezado[0]);
            using (Stream targetStream = headerImg1.GetStream())
            {
                using (FileStream fs = new FileStream(ruta_imagen, FileMode.Open, FileAccess.Read))
                {
                    byte[] buffer = new byte[1024];
                    int bytesread = fs.Read(buffer, 0, 1024);
                    while (bytesread > 0)
                    {
                        targetStream.Write(buffer, 0, bytesread);
                        bytesread = fs.Read(buffer, 0, 1024);
                    }
                }
            }
            string relationshipId = myDoc.MainDocumentPart.GetIdOfPart(headerImg1);
            DocumentFormat.OpenXml.Wordprocessing.Header cabeza = GeneratePageHeaderPart(myDoc, relationshipId);
            cabeza.Save(header);
            header.Header = cabeza;

     }

我无法弄清楚出了什么问题,当我调试时,我发现运行是使用DocumentFormat.OpenXML.Drawing对象填充的,但是文档中没有显示任何内容。即使控制器函数的变量header也有一个Drawing对象,但文档仍然是空白的。啊!我是否提到页面方向仍然是肖像?请帮助这是我第一次尝试使用Open XML

我更新了我的代码,因为我意识到我将ImagePart作为一个整体而不是标题添加到文档中,但仍然没有结果,代码现在显示为:

var header = mainPart.AddNewPart<HeaderPart>("rId2");
            ImagePart headerImg1 = header.AddNewPart<ImagePart>("image/jpeg", "rId3");
            string ruta_imagen = Path.Combine(imageFolder, encabezado[0]);
            string relationshipId = header.GetIdOfPart(headerImg1);
            DocumentFormat.OpenXml.Wordprocessing.Header cabeza = GeneratePageHeaderPart(myDoc, relationshipId);
            header.Header = cabeza;
            using (FileStream fs = System.IO.File.Open(ruta_imagen, FileMode.Open))
                {
                    headerImg1.FeedData(fs);
                }

所以到目前为止我还没有能够在标题中插入图像,但是我已经能够将它插入到正文中,代码现在看起来像:

using (WordprocessingDocument myDoc = WordprocessingDocument.Create(ruta, WordprocessingDocumentType.Document))
        {
            MainDocumentPart mainPart = myDoc.AddMainDocumentPart();
            ImagePart headerImg1 = mainPart.AddNewPart<ImagePart>("image/jpeg", "rId3");
            GenerateMainDocumentPart().Save(mainPart);
            var documentSettingsPart =mainPart.AddNewPart<DocumentSettingsPart>("rId1");
            GenerateDocumentSettingsPart().Save(documentSettingsPart);
            var header = mainPart.AddNewPart<HeaderPart>("rId2");
            ImagePart headerImg2 = header.AddNewPart<ImagePart>("image/jpeg", "rId4");
            string ruta_imagen = Path.Combine(imageFolder, encabezado[3]);
            string relationshipId = header.GetIdOfPart(headerImg2);
            GeneratePageHeaderPart(myDoc, relationshipId, header);


                using (FileStream fs = System.IO.File.Open(ruta_imagen, FileMode.Open))
                {
                    fs.Position = 0;
                    headerImg1.FeedData(fs);
                }



     }

生成正文的代码几乎完全相同(这就是为什么我不明白我做错了什么):

private static Document GenerateMainDocumentPart()
    {
        var elem = new Document(new Body(
            new Paragraph(
                new ParagraphProperties(
                        new SectionProperties(
                        new PageSize(){
                          Orient = PageOrientationValues.Landscape
            }),
                new DocumentFormat.OpenXml.Wordprocessing.Run(
                    new DocumentFormat.OpenXml.Wordprocessing.Text("Page 1 content"))


                        )
            ),
            new Paragraph(
                new DocumentFormat.OpenXml.Wordprocessing.Run(
     new DocumentFormat.OpenXml.Wordprocessing.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 = "Picture 1"
         },
         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 = "New Bitmap Image.jpg"
                         },
                         new PIC.NonVisualPictureDrawingProperties()),
                     new PIC.BlipFill(
                         new A.Blip(
                             new A.BlipExtensionList(
                                 new A.BlipExtension()
                                 {
                                     Uri =
                                       "{28A0092B-C50C-407E-A947-70E740481C1C}"
                                 })
                         )
                         {
                             Embed = "rId3",
                             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"
     }))),

            new SectionProperties(
                    new HeaderReference()
                    {
                        Type = HeaderFooterValues.First,
                        Id = "rId2"
                    })));
        return elem;
    }

0 个答案:

没有答案