با سلام
در این سناریو هدف خروجی بر اساس html است.
مثلا ما در وب سایت چند جدول داریم که برای خودشون یک PartialView هستند و قصد نداریم که باز طراحی دوباره ای انجام بشود.
در این مثال از یک کلاس ViewRenderService کمک گرفتیم برای کشیدن خروجی html از کنترلر ها
public class ViewRenderService{
private readonly ICompositeViewEngine _viewEngine;
private readonly ITempDataProvider _tempDataProvider;
private readonly IServiceProvider _serviceProvider;
private readonly IWebHostEnvironment _env;
public ViewRenderService(
ICompositeViewEngine viewEngine,
ITempDataProvider tempDataProvider,
IServiceProvider serviceProvider,
IWebHostEnvironment env)
{
_viewEngine = viewEngine;
_tempDataProvider = tempDataProvider;
_serviceProvider = serviceProvider;
_env = env;
}
public async Task<string> RenderFromPathAsync(ControllerContext context, string absoluteViewPath, object model)
{
var actionContext = context as ActionContext;
using (var sw = new StringWriter())
{
string relativeViewPath = absoluteViewPath.Replace(_env.ContentRootPath, "").Replace("", "/").TrimStart('/');
var viewResult = _viewEngine.GetView(null, relativeViewPath, false);
if (!viewResult.Success)
{
throw new ArgumentException($"View '{relativeViewPath}' not found.");
}
var viewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};
var tempData = new TempDataDictionary(actionContext.HttpContext, _tempDataProvider);
var viewContext = new ViewContext(
actionContext,
viewResult.View,
viewData,
tempData,
sw,
new HtmlHelperOptions()
);
await viewResult.View.RenderAsync(viewContext);
return sw.ToString();
}
}
}
و ریجستر شدن
builder.Services.AddScoped<ViewRenderService>();
و برای تبدیل راحت با Aspose.Words فایل نهایی اماده میشود که میتوان هم خروجی word تولید کرد و هم pdf در نهایت در تابع پرینت استفاده شدن.
من بلوک کلی میزارم دوستان متوجه نوع رفتار متد هستند
public async Task<IActionResult> MedicalRecordPrint() {
decimal id = Helper.IdUser;
var Cust = await _context.Customers.FindAsync(id);
var Vizit = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/VizitList.cshtml", id);
var Azmayesh = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/AzmayeshList.cshtml", id);
var Profile = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/Profile.cshtml", id);
var Drug = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/DrugList.cshtml", id);
var Hospital = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/HospitalList.cshtml", id);
var Allergies = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/ToListAllergies.cshtml", id);
var Vaccination = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/ToListVaccination.cshtml", id);
var LatestHealth = await _viewRenderService.RenderFromPathAsync(ControllerC ontext, "~/Views/MedicalRecord/Partial/Print/LatestHealth.cshtml", id);
var field = new string[]
{
"HtmlVizit", "HtmlAzmayesh", "HtmlProfile", "HtmlDrug", "HtmlHospital", "HtmlAllergies", "HtmlVaccination", "HtmlLatestHealth",
"LblVizit", "LblAzmayesh", "LblProfile", "LblDrug", "LblHospital", "LblAllergies", "LblVaccination", "LblLatestHealth"
};
var data = new object[] {
(Vizit ?? "").Trim(),
(Azmayesh ?? "").Trim(),
(Profile ?? "").Trim(),
(Drug ?? "").Trim(),
(Hospital ?? "").Trim(),
(Allergies ?? "").Trim(),
(Vaccination ?? "").Trim(),
(LatestHealth ?? "").Trim(),
//--------------------------------
_localizer["RecentVisits"].Value,
_localizer["TestResultsAndOtherReports"].Value,
_localizer["PersonalDetails"].Value,
_localizer["MedicationsInUse"].Value,
_localizer["HospitalizationAndSurgeryHistory"].Value,
_localizer["UnderlyingConditionsAndAllergies"].Value,
_localizer["Vaccination"].Value,
_localizer["LastRecordedHealthStatus"].Value
};
var name = Cust.Email + "_" + DateTime.Now.ToLongDateString() + ".pdf";
var loadFile = Path.Combine(_env.WebRootPath, "Aspose", "MedicalRecord.docx");
var saveFile = Path.Combine(_env.WebRootPath, "Aspose", "Temp", name);
var IsOk = iAspose.BuildPrintLetter(field, data, loadFile, saveFile);
var fileBytes = await System.IO.File.ReadAllBytesAsync(saveFile);
System.IO.File.Delete(saveFile);
//return File(fileBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", name);
var pdfOptions = new PdfSaveOptions
{
EmbedFullFonts = true,
FontEmbeddingMode = PdfFontEmbeddingMode.EmbedAll,
ImageCompression = PdfImageCompression.Jpeg,
JpegQuality = 90,
Compliance = PdfCompliance.PdfA1a,
OptimizeOutput = true
};
return File(fileBytes, "application/pdf", name);
}
نمونه خروجی
https://biaupload.com/do.php?filenam...0389dab673.pdf
کلاس Aspose.Words
https://biaupload.com/do.php?filenam...4794e3c471.zip