2013-08-07 38 views
0

我試圖用「li」和「image」標籤來轉換簡單(現在)的視圖。 在控制器首先我得到的觀點作爲字符串用HTML解析HTML到iTextSharp和MVC 4

  ViewData.Model = model; 
      using (var sw = new StringWriter()) 
      { 
       var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "Print"); 
       var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
       viewResult.View.Render(viewContext, sw); 
       stringView = sw.GetStringBuilder().ToString(); 
      } 

之後,我試圖根據這個documentation

  Document document = new Document(); 
     document.SetPageSize(iTextSharp.text.PageSize.A4); 
     document.Open(); 


     PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream); 

     HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
     htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory()); 
     htmlContext.SetImageProvider(new ImageProvider(Server.MapPath(Config.UploadDirectory), Request.Url.ToString())); 

     //StyleAttrCSSResolver cssRevolver = new StyleAttrCSSResolver(); 
     var cssRevolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true); 

     cssRevolver.AddCssFile(Server.MapPath("~/Content/Site.css"), false); 

     IPipeline pipeline = new CssResolverPipeline(cssRevolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer))); 
     XMLWorker worker = new XMLWorker(pipeline, true); 
     XMLParser parser = new XMLParser(worker); 

     var memViewStream = new MemoryStream(Encoding.UTF8.GetBytes(stringView)); 
     memViewStream.Position = 0; 

     parser.Parse(memViewStream); //this line throw the exception 

     document.Close(); 
     writer.Close(); 

     Response.ContentType = "application/pdf"; 
     return null; 

解析字符串,但我得到這個錯誤,可以」 t弄清楚什麼是錯的

未將對象引用設置爲對象的實例。

堆棧

at iTextSharp.text.pdf.PdfOutline.InitOutline(PdfOutline parent, String title, Boolean open) 
    at iTextSharp.text.pdf.PdfOutline..ctor(PdfOutline parent, PdfDestination destination, Paragraph title, Boolean open) 
    at iTextSharp.text.pdf.PdfOutline..ctor(PdfOutline parent, PdfDestination destination, Paragraph title) 
    at iTextSharp.tool.xml.html.Header.WriteH.Write(PdfWriter writer, Document doc) 
    at iTextSharp.text.pdf.PdfDocument.Add(IElement element) 
    at iTextSharp.text.Phrase.Process(IElementListener listener) 
    at iTextSharp.text.pdf.PdfDocument.Add(IElement element) 
    at iTextSharp.text.List.Process(IElementListener listener) 
    at iTextSharp.text.pdf.PdfDocument.Add(IElement element) 
    at iTextSharp.text.Document.Add(IElement element) 
    at iTextSharp.tool.xml.pipeline.end.PdfWriterPipeline.Write(IWorkerContext context, ProcessObject po) 
    at iTextSharp.tool.xml.pipeline.end.PdfWriterPipeline.Close(IWorkerContext context, Tag t, ProcessObject po) 
    at iTextSharp.tool.xml.XMLWorker.EndElement(String tag, String ns) 
    at iTextSharp.tool.xml.parser.XMLParser.EndElement() 

我沒有想法,爲什麼InitOutline拋出exception.Any想法? 感謝

+0

什麼iTextSharp的和XmlWorker的版本是你使用? –

回答

1

如果你想打印從查看PDF則只是通過看這個功能有刺的格式(HTML)

你會得到PDF

String htmlText = html.ToString(); <== Html is a view page html string 
Document document = new Document(); 
string filePath = HostingEnvironment.MapPath("~/Content/Pdf/"); 
PdfWriter.GetInstance(document, new FileStream(filePath + "\\pdf-"+Name+".pdf", FileMode.Create)); 
document.Open(); 

iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document); 
FontFactory.Register(Path.Combine(_webHelper.MapPath("~/App_Data/Pdf/arial.ttf")), "Garamond"); // just give a path of arial.ttf 
StyleSheet css = new StyleSheet(); 
css.LoadTagStyle("body", "face", "Garamond"); 
css.LoadTagStyle("body", "encoding", "Identity-H"); 
css.LoadTagStyle("body", "size", "12pt"); 
hw.SetStyleSheet(css); 

hw.Parse(new StringReader(htmlText));