הנה הקוד שאתה צריך כדי ליצור מיזוג בקובץ 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)