הנה הקוד שאתה צריך כדי ליצור מיזוג בקובץ PDF.
אתה צריך לכלול את הספריה הבאה בפרוייקט שלך: https://www.nrecosite.com/pdf_generator_net.aspx
אם אתה רוצה שקובץ הPDF יהיה מעוצב יפה, אתה צריך  ליצור HTML ואח"כ להמיר אותו לPDF.
חשוב- תוודא שההפניות לקבצי הCSS שלך יהיו הפניות מלאות ולא חלקיות (דהיינו נתיב מוחלט), אח"כ הספריה הנ"ל לא תדע לטעון אותם.
בהצלחה!
using NReco.PdfGenerator;
using System.IO;
using System.Threading.Tasks;
using System.Web.Mvc;
namespace EmailService
{
    /// <summary>
    /// מחלקה לדוגמה שמכילה את המידע העדכני עבור יצירת הקובץ
    /// </summary>
    public class ContentFile
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string CustomerName { get; set; }
    }
    public static class CreatePdfFile
    {
        /// <summary>
        /// יוצר קובץ פי.די.אף מקומי על השרת
        /// </summary>
        /// <param name="content"></param>
        /// <param name="fileName"></param>
        /// <param name="path"></param>
        /// <param name="controller"></param>
        /// <returns></returns>
        public static async Task<bool> CreateFile(ContentFile content, string fileName, string path, ControllerContext controller)
        {
            bool success = false;
            var stream = await CreateStream(content, controller);
            using (FileStream fs = new FileStream(fileName, FileMode.Create))
            {
                stream.WriteTo(fs);
                success = true;
            }
            
            return success;
        }             
        /// <summary>
        /// מחזיר סטרים של קובץ פי.די.אף בלא לשמור על השרת
        /// יותר נח כאשר רוצים לשלוח מייל או לתת ללקוח להוריד מהדפדפן
        /// כך אתה מפחית את העומס מהשרת שלך
        /// </summary>
        /// <param name="content"></param>
        /// <param name="controller"></param>
        /// <returns></returns>
        public static async Task<MemoryStream> CreateStream(ContentFile content, ControllerContext controller)
        {
            var html = await CreateHtmlToString(content, controller);
            MemoryStream memory = new MemoryStream();
            //משתמש בספריה NReco.PdfGenerator - ניתנת להתקנה דרך NuGet
            var htmlToPDF = new HtmlToPdfConverter();
            var pdfBytes = htmlToPDF.GeneratePdf(html);
            htmlToPDF.CustomWkHtmlArgs = " --load-media-error-handling ignore ";
            htmlToPDF.GeneratePdf(html, null, memory);
            memory.Position = 0;
            return memory;
        }
       
        private static async Task<string> CreateHtmlToString(ContentFile content, ControllerContext controller)
        {             
            //הנתיב צריך להפנות לקובץ ההטמל הנכון
            string html = RenderViewToString(controller,
                "~/Views/Email/CreateFileInHtml.cshtml",
                content, true);
            return html;
        }
        
        private static string RenderViewToString(ControllerContext context,
                                   string viewPath,
                                   object model = null,
                                   bool partial = false)
        {
            // first find the ViewEngine for this view
            ViewEngineResult viewEngineResult = null;
            if (partial)
                viewEngineResult = ViewEngines.Engines.FindPartialView(context, viewPath);
            else
                viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null);
            if (viewEngineResult == null)
                throw new FileNotFoundException("View cannot be found.");
            // get the view and attach the model to view data
            var view = viewEngineResult.View;
            context.Controller.ViewData.Model = model;
            string result = null;
            using (var sw = new StringWriter())
            {
                var ctx = new ViewContext(context, view,
                                            context.Controller.ViewData,
                                            context.Controller.TempData,
                                            sw);
                view.Render(ctx, sw);
                result = sw.ToString();
            }
            return result;
        }
    }
}
פורסם במקור בפורום CODE613 ב06/06/2017 16:57 (+03:00)
 )
