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 Réponses :
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.
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
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.
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
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
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("Properties.Resources.AnImage.png")
puisXImage.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