1
votes

Comment utiliser une image de ressources avec PDFsharp?

J'utilise la bibliothèque PDFsharp pour faire une manipulation simple des fichiers PDF.
J'ai le code suivant pour copier une image d'un dossier dans un document PDF existant - cela fonctionne comme prévu:

Properties.Resources.AnImage

Pour rendre la solution plus portable, j'ai déplacé le fichier image AnImage.png dans les ressources du projet - ici:

public void AddImagePDF()
{
  this.DrawPage(this.PDFdoc.Pages[0]);
  this.DrawPage(this.PDFdoc.Pages[1]);
  this.DrawPage(this.PDFdoc.Pages[2]);
}
private void DrawPage(PdfPage page)
{
  XGraphics gfx = XGraphics.FromPdfPage(page);
  DrawPng(gfx);
}
private void DrawPng(XGraphics gfx)
{

  XImage imageMu = XImage.FromFile(@"C:\Images\AnImage.png");
  double width = imageMu.PixelWidth * 7.0 / imageMu.HorizontalResolution;
  double height = imageMu.PixelHeight * 7.0 / imageMu.HorizontalResolution;
  gfx.DrawImage(imageMu,500,30,width,height); 

  this.PDFdoc.Save(this.DestinationFullPath);
}

Mais quelles modifications dois-je apporter au code pour utiliser le fichier de ressources plutôt que le fichier enregistré dans le C-Drive?


3 commentaires

Double possible de Comment obtenir le chemin de Properties.Resources.Image dans .NET Vous pouvez obtenir l'image en utilisant la dernière réponse de cet article en faisant XImage imageMu = XImage.FromGdiPlusImage(Properties.Resources.AnImage);


Pour obtenir les ressources des projets, vous devez utiliser Assembly.GetExecutingAssembly().GetManifestResourceStream("P‌​roperties.Resources.‌​AnImage.png") puis XImage.FromStream ? Je ne sais pas si cela fait partie de l'API PDFSharp.


J'ai également trouvé ceci sur leur wiki, peut-être que cela vous aidera: pdfsharp.net/wiki/MigraDoc_FilelessImages.ashx?HL=stream


3 Réponses :


1
votes

Vous pouvez utiliser XImage.FromStream après avoir obtenu un flux pour la ressource image.

BTW: Il est plus efficace et créera probablement des PDF plus petits si vous ne créez le XImage qu'une seule fois et que vous l'utilisez pour toutes les pages.


0 commentaires

1
votes

Vous pouvez utiliser la méthode FromGdiPlusImage de pdfsharp , comme ceci:

System.Reflection.Assembly thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("Properties.Resources.AnImage.png");
Ximage yourImage = XImage.FromStream(file);

La réponse provient d'un autre article de Stack Overflow et répond à:

Comment obtenir le chemin de Properties.Resources.Image dans .NET

Si, comme vous l'avez dit dans votre commentaire, vous ne pouvez pas utiliser FromGdiPlusImage il est possible de le charger en tant que flux, cela a été extrait d'un autre article Stack Overflow:

XImage imageMu = XImage.FromGdiPlusImage(Properties.Resources.AnImage);

Charger l'image à partir de la zone de ressources du projet en C # - réponse de David Icardi


3 commentaires

hmmm ... Je reçois un message "'XImage' ne contient pas de définition pour 'FromGdiPlusImage'" ... dans XImage.cs je peux voir une méthode statique commentée FromGdiPlusImage - que dois-je faire pour être capable d'y avoir accès?


@whytheq S'il est commenté, ne pouvez-vous pas simplement le décommenter?


@whytheq Si vous ne pouvez pas décommenter et utiliser FromGdiPlusImage j'ai ajouté à ma réponse, qui n'est qu'une référence à un autre article sur le site.



-1
votes

Convertissez la ressource en octets:

            using System;
            using System.Drawing;
            using System.IO;
            using ITNETAWF.Properties; //WinForms Project

            using PDFDocument = MigraDoc.DocumentObjectModel.Document;
            using PDFImage = MigraDoc.DocumentObjectModel.Shapes.Image;
            using PDFRelativeHorizontal = MigraDoc.DocumentObjectModel.Shapes.RelativeHorizontal;
            using PDFRelativeVertical = MigraDoc.DocumentObjectModel.Shapes.RelativeVertical;
            using PDFSection = MigraDoc.DocumentObjectModel.Section;
            using PDFShapePosition = MigraDoc.DocumentObjectModel.Shapes.ShapePosition;
            using PDFWrapStyle = MigraDoc.DocumentObjectModel.Shapes.WrapStyle;


            namespace PdfSharpImage
            {
                public class Class1
                {
                    private void CreatePage()
                    {
                        byte[] zbytData;
                        Bitmap zbmpData;
                        string zstrDataB64;
                        MemoryStream zmstFlujoMemoria;
                        PDFDocument document;
                        PDFImage image;
                        PDFSection section;


                        // Each MigraDoc document needs at least one section.
                        document = new PDFDocument();
                        section = document.AddSection();

                        // Put a logo in the header
                        //---------------------------------------------------------------------------------------------------------------------------------------------------------------//
                        //  Logo MFG 225x32.png is an image in the .resx file 
                        //  Logo MFG 225x32.png  width/height=107/32 pixel  width/height=2.83/0.85 cm  width/height=1.11/0.33 inch
                        //  
                        //  Resources.resx file Code:
                        //  <data name="Logo MFG 225x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
                        //    <value>..\Resources\Logo MFG 225x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
                        //  </data>
                        //---------------------------------------------------------------------------------------------------------------------------------------------------------------//
                        zbmpData = Resources.ResourceManager.GetObject("Logo MFG 225x32") as Bitmap;
                        zbytData = new byte[13750]; // 13750 - The size in bytes of the Image
                        zmstFlujoMemoria = new MemoryStream(zbytData);
                        zbmpData.Save(zmstFlujoMemoria, System.Drawing.Imaging.ImageFormat.Bmp);
                        zstrDataB64 = String.Format("base64:{0}", Convert.ToBase64String(zbytData));
                        //image = section.Headers.Primary.AddImage("../../PowerBooks.png");
                        image = section.Headers.Primary.AddImage(zstrDataB64);
                        //image.Height = "2.5cm";
                        image.Height = "1.11cm";
                        image.LockAspectRatio = true;
                        image.RelativeVertical = PDFRelativeVertical.Line;
                        image.RelativeHorizontal = PDFRelativeHorizontal.Margin;
                        image.Top = PDFShapePosition.Top;
                        image.Left = PDFShapePosition.Right;
                        image.WrapFormat.Style = PDFWrapStyle.Through;
                    }
                }
            }
            // http://www.pdfsharp.net/wiki/Invoice-sample.ashx
            // http://www.pdfsharp.net/wiki/MigraDoc_FilelessImages.ashx


1 commentaires

Cet article ne répond pas à la question ici! La question concerne PDFsharp (classe XImage), la réponse est pour MigraDoc (classe Image). Une meilleure solution pour MigraDoc peut être trouvée ici: pdfsharp.net/wiki/MigraDoc_FilelessImages.ashx