Willy laroche

B10g $ur 13$ t3chn0$ M!cr0$0ft 3t p1u$ $! 4ff!n!té$…

Insérer des images avec Open Office XML

Poster un commentaire

Pour faire un petit rappel, Open Office Xml est une méthode permettant de générer des fichiers Office (Word et Excel) à travers une application ou autre.
Le processus de génération s’effectue côté serveur et ne requiert pas l’installation d’Office sur le serveur.

Il est indispensable au niveau du projet de référencer 2 librairies: 

  • WindowsBase.dll
  • DocumentFormat.OpenXml.dll

Une description d’Open Office XML est dispo ici:

Avant tout, il faut installer le SDK :

Le SDK permet de générer les classes nécessaires à la génération du fichier (Word ou Excel par exemple).

 Créer un fichier Word 2007 et importer dans le SDK afin de générer les classes correspondantes qui devront être intégrées à votre projet.
La problématique est de savoir comment intégrer des images dans le document (logo, icônes…)

La fonction à copier qui prend en entrée:
  • ·         Le document,
  • ·         Le chemin de l’image,
  • ·         La taille de l’image (largeur, hauteur)
 Dans cet exemple, les images sont déclarées en statique dans la classe.
Les images devront être ajoutées au projet (soit en direct, soit dans les ressources).
public static void GenerateImagePart(OpenXmlPart part, string imageFilePath, ref long imageWidthEMU, ref long imageHeightEMU)
    {
        byte[] imageFileBytes;
        Bitmap imageFile;
        // Open a stream on the image file and read it’s contents.
        using (FileStream fsImageFile = File.OpenRead(imageFilePath))
        {
            imageFileBytes = new byte[fsImageFile.Length];
            fsImageFile.Read(imageFileBytes, 0, imageFileBytes.Length);
            imageFile = new Bitmap(fsImageFile);
        }
        // Get the dimensions of the image in English Metric Units (EMU)
        // for use when adding the markup for the image to the document.
        imageWidthEMU = (long)((imageFile.Width / imageFile.HorizontalResolution) * 914400L);
        imageHeightEMU = (long)((imageFile.Height / imageFile.VerticalResolution) * 914400L);
        // Write the contents of the image to the ImagePart.
        using (BinaryWriter writer = new BinaryWriter(part.GetStream()))
        {
            writer.Write(imageFileBytes);
            writer.Flush();
        }
    }
Exemple d’appel de la fonction « GenerateImagePart() » :
public class OpenXmlImage
{
    private static string exportDirectoryPath = ConfigurationManager.AppSettings[« ExportDirectoryPath »].ToString();
    private static string imageFolder = ConfigurationManager.AppSettings[« ImagesDirectoryPath »].ToString();
    private static String imageTitleName = « TITLE.jpg »;
    private static String imageAvailableName = « img.PNG »;
    private static String imageGenerateName = « pn.PNG »;
    private static String imageGreenName = « nav_plain_green.png »;
    private static String imageRedName = « nav_plain_red.png »;
    private static String GraphicDataUri = « http://schemas.openxmlformats.org/drawingml/2006/picture »;
    public static void CreateDocument(String p_fileName, String p_xml)
    {
        using (WordprocessingDocument doc =
               WordprocessingDocument.Create(exportDirectoryPath + p_fileName, WordprocessingDocumentType.Document))
        {
            ExtendedFilePropertiesPart extendedFilePropertiesPart1 = doc.AddNewPart(« rId3 »);
            GeneratePartContent(extendedFilePropertiesPart1);
            //Add a main document part.
            MainDocumentPart mainPart = doc.AddMainDocumentPart();
            // Create the document structure and add some text.
            mainPart.Document = new Document();
            Body body = mainPart.Document.AppendChild(new Body());
            SectionProperties sectionProperties1 = GenerateSectionProperties();
            body.Append(sectionProperties1);
            DocumentSettingsPart documentSettingsPart1 = mainPart.AddNewPart(« rId3 »);
            GeneratePartContent(documentSettingsPart1);
            ThemePart themePart1 = mainPart.AddNewPart(« rId7 »);
            GeneratePartContent(themePart1);
            StyleDefinitionsPart styleDefinitionsPart1 = mainPart.AddNewPart(« rId2 »);
            GeneratePartContent(styleDefinitionsPart1);
            FontTablePart fontTablePart1 = mainPart.AddNewPart(« rId6 »);
            GeneratePartContent(fontTablePart1);
            FootnotesPart footnotesPart1 = mainPart.AddNewPart(« rId5 »);
            GeneratePartContent(footnotesPart1);
            WebSettingsPart webSettingsPart1 = mainPart.AddNewPart(« rId4 »);
            GeneratePartContent(webSettingsPart1);
            //Image Available
            imageAvailablePart = mainPart.AddImagePart(ImagePartType.Png);
            GenerateImagePart(imageAvailablePart, imageFolder + imageAvailableName,
                                    ref imageAvailableWidthEMU, ref imageAvailableHeightEMU);
            //Image Generate
            imageGeneratePart = mainPart.AddImagePart(ImagePartType.Png);
            GenerateImagePart(imageGeneratePart, imageFolder + imageGenerateName,
                                    ref imageGenerateWidthEMU, ref imageGenerateHeightEMU);
            //Image Green
            imageGreenPart = mainPart.AddImagePart(ImagePartType.Png);
            GenerateImagePart(imageGreenPart, imageFolder + imageGreenName,
                                    ref imageGreenWidthEMU, ref imageGreenHeightEMU);
            //Image Red
            imageRedPart = mainPart.AddImagePart(ImagePartType.Png);
            GenerateImagePart(imageRedPart, imageFolder + imageRedName,
                                    ref imageRedWidthEMU, ref imageRedHeightEMU);
            //Extract data to xml
            System.Xml.XmlDocument document = new System.Xml.XmlDocument();
            document.LoadXml(p_xml);
            System.Xml.XmlNode node = document.DocumentElement;
            for (int i = 0; i < node.ChildNodes.Count – 1; i++)
            {
                if (i > 0)
                {
                    body.Append(GenerateParagraphBreakPage());
                }
                System.Xml.XmlNodeList nodeListConfig = node.SelectNodes(« Config » + i);
                System.Xml.XmlNodeList nodeConfiguration = nodeListConfig[0].SelectNodes(« Configuration »);
                System.Xml.XmlNodeList nodeListLoad = nodeListConfig[0].SelectNodes(« Load »);
                //Create the diferent part of the document
                body.Append(GenerateBarTitle(mainPart));
                body.Append(GenerateBarTitleCriterion());
                body.Append(GenerateParagraphGeneral(nodeConfiguration));
                body.Append(GenerateParagraph());
                body.Append(GenerateParagraph());
                body.Append(GenerateParagraph());
                body.Append(GenerateParagraph());
                body.Append(GenerateBarTitleLoadList());
                body.Append(GenerateParagraph());
                //body.Append(GenerateTableResult(nodeListLoad, mainPart));
                if (nodeListLoad[0].ChildNodes.Count == 0)
                {
                    body.Append(GenerateParagraphNoLoads());
                }
                else
                {
                    body.Append(GenerateTableResult(nodeListLoad, mainPart));
                }
            }
            System.Xml.XmlNodeList nodeInformation = node.SelectNodes(« Information »);
            // Create a new Footer part and grab its id for the Footer reference.
            FooterPart footerPart = mainPart.AddNewPart();
            string rId = mainPart.GetIdOfPart(footerPart);
            //Create our Footer reference
            FooterReference footerRef = new FooterReference();
            footerRef.Id = rId;
            sectionProperties1.RemoveAllChildren();
            sectionProperties1.Append(footerRef);
            //Now populate the Footer contents
            GenerateFooter(footerPart, nodeInformation[0].SelectNodes(« UserName »)[0].InnerText.ToString());
            footerPart.Footer.Save();
        }
    }
    public static void GenerateImagePart(OpenXmlPart part, string imageFilePath, ref long imageWidthEMU, ref long imageHeightEMU)
    {
        byte[] imageFileBytes;
        Bitmap imageFile;
        // Open a stream on the image file and read it’s contents.
        using (FileStream fsImageFile = File.OpenRead(imageFilePath))
        {
            imageFileBytes = new byte[fsImageFile.Length];
            fsImageFile.Read(imageFileBytes, 0, imageFileBytes.Length);
            imageFile = new Bitmap(fsImageFile);
        }
        // Get the dimensions of the image in English Metric Units (EMU)
        // for use when adding the markup for the image to the document.
        imageWidthEMU = (long)((imageFile.Width / imageFile.HorizontalResolution) * 914400L);
        imageHeightEMU = (long)((imageFile.Height / imageFile.VerticalResolution) * 914400L);
        // Write the contents of the image to the ImagePart.
        using (BinaryWriter writer = new BinaryWriter(part.GetStream()))
        {
            writer.Write(imageFileBytes);
            writer.Flush();
        }
    }
}

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s