Mvc ile pdf belgeleri hazırlamak için kullandığım sistemi anlatmak istiyorum.
Kullandığım sistem de bir partialView ile hem kullanıcı ya ön izleme hemde pdf çıktısı için tek bir kaynak kullanmış oluyorum. Bu sistemin avantaj ve dezavantajları mevcuttur. Bu sistemde Mvc model yapısını istediğim gibi kullanabiliyorum ve önizleme ve çıktı için 2 ayrı tasarım ile uğraşmıyorum, bu işin avantajı idi. Dezavantajı ise pdf render etme kısmında css sıkıntıları çıkabiliryor.
public ActionResult Download()
{
var data = ... ...
var buf = ViewPdf(" _Ek1" , data) ;
return File(buf, " application/pdf" , " print. Pdf" ) ;
}
private MemoryStream ViewPdfForEk1(string viewName, object model)
{
var doc = new Document(new Rectangle(877f, 1240f) , 30f, 30f, 30f, 30f) ; // Dokuman boyutlandırma
var memStream = new MemoryStream() ;
var writer = PdfWriter. GetInstance(doc, memStream) ;
doc. Open() ;
//Partial View Html parse. Bu kısımda verileriniz partial view içerisine bind edilip en son hali ile html olarak kullanılır
var viewText = RenderPartialViewToString(viewName, model) ;
var htmlWorker = new HTMLWorker(doc) ;
var styles = new StyleSheet() ;
//Font ayarlamaları
FontFactory. Register(" c:\\windows\\fonts\\arial.ttf" ) ;
styles. LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, " arial" ) ;
styles. LoadTagStyle(HtmlTags.BODY, HtmlTags. ENCODING, " Identity-H" ) ;
//Tasarım için 2 farklı düzenleme seçenekleri
styles. LoadTagStyle(" h2" , " align" , " center" ) ;
styles. LoadStyle(" captionBig" , " align" , " center" ) ;
htmlWorker. SetStyleSheet(styles) ;
var reader = new StringReader(viewText) ;
htmlWorker. Parse(reader) ;
writer. CloseStream = false;
doc. Close() ;
memStream. Flush() ;
memStream. Position = 0;
return memStream;
}
private string RenderPartialViewToString(string viewName, object model)
{
if (string. IsNullOrEmpty(viewName) )
viewName = ControllerContext. RouteData. GetRequiredString(" action" ) ;
ViewData. Model = model;
using (var sw = new StringWriter() )
{
var viewResult = ViewEngines. Engines. FindPartialView(ControllerContext, viewName) ;
var viewContext = new ViewContext(ControllerContext, viewResult. View, ViewData, TempData, sw) ;
viewResult. View. Render(viewContext, sw) ;
return sw. GetStringBuilder() . ToString() ;
}
}