Comment ajouter une image à la volée avec Microsoft Reporting (rdlc)

 

Pour des besoins techniques il fallait que je puisse ajouter une image générée à la volée dans un Report (rdlc). Malheureusement il n’est pas possible de passer le contenu d’une image directement dans le report, celui-ci n’acceptant que les fichiers physiques ou des urls.

Cela etant dit une première solution serait de generer une image bien precise dans un reportoire et de faire pointer le chemin du fichier dans l’image, avec le risque de verrouillage de fichier que cette opération comporte, ceci n’est pas très solide

Une deuxieme solution “standard” serait de creer un dataset, ajouter une colonne de type tableau de byte et de binder sa valeur sur le parametre Value de l’image en definissant qu’il s’agit d’une source venant d’une base de donnée. (voir ci-dessous)

image

Cette technique fonctionne très bien mais il faut definir un dataset puis le passer comme source de donnée au report, je la trouve assez contraignante a mettre en place.

Il existe une solution “non documentée” dont le principe est d’injecter à la volée l’image en tant que ressource embarquée et de faire pointer son identifant en valeur de l’image en indiquant qu’il s’agit d’un embeded image. Voici comment j’ai pratiqué :

public partial class Form1 : Form


{


    public Form1()


    {


        InitializeComponent();


    }


 


    private void Form1_Load(object sender, EventArgs e)


    {


        XmlDocument doc = new XmlDocument();


        doc.Load(@".\Report1.rdlc");


 


        string image = @"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";


 


        string reportContent = SetReportImages(doc, "image1", "image/png", image);


 


        using (System.IO.TextReader reader = new System.IO.StringReader(reportContent))


        {


            this.reportViewer1.LocalReport.LoadReportDefinition(reader);


        }


 


        this.reportViewer1.RefreshReport();


    }


 


    private string SetReportImages(XmlDocument doc, string imageName, string mimeType, string contentBase64)


    {


        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);


        nsmgr.AddNamespace("nm", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");


        nsmgr.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");


 


        XmlNode embededImageNode = doc.DocumentElement.SelectSingleNode("//nm:EmbeddedImages", nsmgr);


        if (embededImageNode == null)


        {


            XmlElement embededImageElement = doc.CreateElement("EmbeddedImages");


            embededImageNode = doc.DocumentElement.AppendChild(embededImageElement);


        }


 


        string imgref = string.Format("IMG{0}", Guid.NewGuid().ToString().Substring(0, 5));


        XmlElement imageElement = doc.CreateElement("EmbeddedImage", null);


        embededImageNode.AppendChild(imageElement);


        XmlAttribute name = doc.CreateAttribute("Name");


        name.InnerText = imgref;


        imageElement.Attributes.Append(name);


        XmlElement mimeTypeElement = doc.CreateElement("MIMEType");


        mimeTypeElement.InnerText = mimeType;


        imageElement.AppendChild(mimeTypeElement);


        XmlElement imageDataElement = doc.CreateElement("ImageData");


        imageDataElement.InnerText = contentBase64;


        imageElement.AppendChild(imageDataElement);


 


        string imagePath = string.Format("//nm:Image[@Name='{0}']", imageName);


        XmlNode imageNode = doc.DocumentElement.SelectSingleNode(imagePath, nsmgr);


 


        if (imageNode != null)


        {


            XmlNode value = imageNode.SelectSingleNode("nm:Value", nsmgr);


            value.InnerText = imgref;


            XmlNode mimeTypeNode = imageNode.SelectSingleNode("nm:MIMEType", nsmgr);


            if (mimeTypeNode == null)


            {


                mimeTypeNode = doc.CreateElement("MIMEType");


                imageNode.AppendChild(mimeTypeNode);


            }


            mimeTypeNode.InnerText = mimeType;


        }


        string result = doc.InnerXml.Replace("xmlns=\"\"", "");


        return result;


    }


 


}




Voici le contenu du fichier rdlc :





<?xml version="1.0" encoding="utf-8"?>


<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">


  <InteractiveHeight>29.7cm</InteractiveHeight>


  <rd:DrawGrid>true</rd:DrawGrid>


  <InteractiveWidth>21cm</InteractiveWidth>


  <rd:GridSpacing>0.25cm</rd:GridSpacing>


  <rd:SnapToGrid>true</rd:SnapToGrid>


  <RightMargin>2.5cm</RightMargin>


  <LeftMargin>2.5cm</LeftMargin>


  <BottomMargin>2.5cm</BottomMargin>


  <rd:ReportID>f78945fb-499e-4d74-89e2-b953af73c02c</rd:ReportID>


  <PageWidth>21cm</PageWidth>


  <Width>9.75cm</Width>


  <Body>


    <ColumnSpacing>1cm</ColumnSpacing>


    <ReportItems>


      <Image Name="image1">


        <Sizing>AutoSize</Sizing>


        <Top>1cm</Top>


        <Width>0.7619cm</Width>


        <Source>Embedded</Source>


        <Style />


        <Left>1.5cm</Left>


        <Height>0.7619cm</Height>


        <Value>=""</Value>


      </Image>


    </ReportItems>


    <Height>5.75cm</Height>


  </Body>


  <Language>en-US</Language>


  <TopMargin>2.5cm</TopMargin>


  <PageHeight>29.7cm</PageHeight>


</Report>




Le principe est de charger le fichier rdlc (ici en tant que fichier) , l’ouvrir avec un objet xmldocument puis rechercher la section embededimage, si elle n’existe pas la creer , puis ajouter l’image et enfin renseigner la propriété Value du controle image avec le pointeur vers l’image nouvellement embarquée, voici le resultat :



 



image



Je ne resiste pas a me faire un peu de pub ;)



ci-dessous le code source du projet :



Aucun commentaire: