在多个图片内容控件中打开XML添加图像

时间:2014-05-06 13:00:42

标签: c# openxml office-2010

好吧,旧问题已经消失了,这是新问题:

@JasonPlutext,我们决定按照你的建议去做。自定义xml看起来像: <DATA> <BLOCK> <FNAME>Test</FNAME> <LNAME>Test1</LNAME> </BLOCK> <PICTURE> <SIG> domain\username</SIG> </PICTURE> </DATA>

文本控件绑定:$ rowBlock.FNAME,$ rowBlock.LNAME和图片内容控件是$ rowPicture.SIG。 显示来自xml的文本,但没有图片...

图片由ws返回(网络服务输入参数是来自<sig>的域\用户名,图片以字节[]的形式返回。 //this is part of code where dealing with picture content control picture[] pic = getPic("domain\username"); Paragraph tP = new Paragraph(); ParagraphProperties tParagraphProperties = pControl.Descendants<ParagraphProperties>).FirstOrDefault(); tP.ParagraphProperties = (ParagraphProperties)tParagraphProperties.Clone(); ...?...

请建议下一步做什么以及如何绑定图片? THX

2 个答案:

答案 0 :(得分:0)

您可以考虑采用略有不同的方法。

您可以将图片内容控件绑定到包含base64编码图像的自定义xml部件中的元素。

如果以这种方式执行此操作,则可以依靠Word来解析绑定(即使用自定义xml部件中的图像更新文档表面上的图像)。或者你可以模仿Word自己做的事情; docx4j.NET包含为您执行此操作的代码。

这样做只需要用你想要的图像更新自定义xml部分。

答案 1 :(得分:0)

杰森,正如你所说,我正在注入base64编码的图像内容,但仍然没有图片。在zip文档的customXml文件夹中,在item3.xml中,标签内部有一个base64字符串,但在媒体文件夹中只有默认图像。不知道出了什么问题......我的程序是:

//首先,在当前处理控件中搜索绘图

`Drawing tDraw = pControl.Descendants<Drawing>().FirstOrDefault();

//if there is a drawing element, then clone control
OpenXmlElement tClone = (OpenXmlElement)pControl.Clone();
//then call method: 
 private static void insertPicture(OpenXmlElement pControl)
    {
        //WordprocessingDocument wordDoc = WordprocessingDocument.Open(dokument, true);
        MainDocumentPart mainPart = dokument.MainDocumentPart;
        CustomXmlPart customPart = mainPart.CustomXmlParts.FirstOrDefault();

        //convert image into string
        string picName = @"c:\temp\picasso.png";
        System.IO.FileStream fileStream = System.IO.File.Open(picName, System.IO.FileMode.Open);
        System.IO.BinaryReader br = new System.IO.BinaryReader(fileStream);
        byte[] byteArea;
        byteArea = br.ReadBytes(System.Convert.ToInt32(fileStream.Length));
        string picString = System.Convert.ToBase64String(byteArea);

        //Load the XML template
        string DataString = iData["DATA"].ToString();
        //Properties.Resources.XMLData;
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(DataString);

        //change the value
        XmlNodeList xmlNode = xmlDoc.GetElementsByTagName("picture");
        xmlNode[0].InnerText = picString;

        //write the custom xml data into the customxmlpart
        System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(customPart.GetStream(System.IO.FileMode.Create), System.Text.Encoding.UTF8);
        writer.WriteRaw(xmlDoc.InnerXml);
        writer.Flush();
        writer.Close();

        fileStream.Close();
        br.Close();

        mainPart.Document.Save();
        //dokument.Close();
    }

then append control to document
OpenXmlElement tC1 = pControl;
            IEnumerable<Run> tEl1 = tClone.Descendants<Run>();
            if (tEl1.Count() != 0)
            {
                foreach (OpenXmlElement tElement in tEl1.Reverse())
                {
                    OpenXmlElement tClone1 = (OpenXmlElement)tElement.Clone();
                    tC1.InsertBeforeSelf(tClone1);
                    tC1 = tClone1;
                }
            }`