2014-07-25 61 views
0

我一直試圖讓我的MVC應用程序基於MVC Views創建pdf文件。我用純html處理了這個問題。但我也想提示我用於瀏覽器的css文件。現在,他們中的一些工作,但與一個我得到以下錯誤:iTextSharp輸入字符串的格式不正確css錯誤

An exception of type 'System.FormatException' occurred in mscorlib.dll but was not handled in user code

Additional information: Input string was not in a correct format.

我使用下面的代碼:

var data = GetHtml(new IndexModel(Context), "~\\Views\\Home\\Index.cshtml", ""); 
      using (var document = new iTextSharp.text.Document()) 
      { 

       //define output control HTML 
       var memStream = new MemoryStream(); 
       TextReader xmlString = new StringReader(data); 
       PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("c:\\tmp\\my.pdf", FileMode.OpenOrCreate)); 

       //open doc 
       document.Open(); 

       // register all fonts in current computer 
       FontFactory.RegisterDirectories(); 

       // Set factories 
       var htmlContext = new HtmlPipelineContext(null); 
       htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory()); 

       // Set css 
       ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false); 
       cssResolver.AddCssFile(HttpContext.Server.MapPath("~/Content/elements.css"), true); 
       cssResolver.AddCssFile(HttpContext.Server.MapPath("~/Content/style.css"), true); 
       cssResolver.AddCssFile(HttpContext.Server.MapPath("~/Content/jquery-ui.css"), true); 
       // Export 
       IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer))); 
       var worker = new XMLWorker(pipeline, true); 
       var xmlParse = new XMLParser(true, worker); 
       xmlParse.Parse(xmlString); 
       xmlParse.Flush(); 

       document.Close(); 

      } 

字符串「數據」是正確的,並沒有問題,問題就出與AddCssFile()。 如果我創建的PDF格式沒有和CSS文件一切正常,但包括CSS文件觸發錯誤。

幫助將非常感激。

+0

是否與所有三個CSS文件或只是一個特定的一個突破?您使用的是什麼版本的iTextSharp和XMLWorker?這可能很難遠程排除故障,我建議爲它們獲取源代碼,然後逐步通過調試器來查看引發異常的東西。 –

回答

0

我不知道確切的答案,但通過查看你回來的錯誤,我會嘗試兩種不同的方法。

  1. 移動

    cssResolver.AddCssFile(HttpContext.Server.MapPath("~/Content/elements.css"), true);

    要像

    var cssPath = HttpContext.Server.MapPath("~/Content/elements.css"), true); cssResolver.AddCssFile(cssPath);

然後設置一個斷點,並查看cssPath返回的值。確保它們是準確的並且不包含任何奇怪的字符。

第二種方法...如果所有其他方法都失敗,請嘗試給CSS資源(如http://yourdomain.com/cssPath)提供一個絕對URL,而不是文件系統路徑。

如果這兩個appraoches中的任何一個幫助你,那麼你可以用它來確定實際的問題,然後重構它到你的心中。

UPDATE --------------------------------------------- ---------------------> 根據文檔,您需要該文件的絕對URL,因此Server.MapPath將不起作用。

addCssFile 

void addCssFile(String href, 
       boolean isPersistent) 
       throws CssResolverException 
Add a 
Parameters: 
href - the link to the css file (an absolute uri) 
isPersistent - true if the added css should not be deleted on a call to clear 
Throws: 
CssResolverException - thrown if something goes wrong 

在這種情況下,我會嘗試使用類似:

public string AbsoluteContent(string contentPath) 
    { 
     var path = Url.Content(contentPath); 
     var url = new Uri(HttpContext.Current.Request.Url, path); 

     return url.AbsoluteUri; 
    } 

,並使用它像這樣:

var cssPath = AbsoluteContent("~/Content/embeddedCss/yourcssfile.css"); 
+0

嗨大衛,伊克嘗試了你的兩個提示,仍然得到相同的錯誤。 –

+0

你可以發佈什麼cssPath變量設置爲當你通過它? –

+0

C:\\ ProjectenTFS \\ mgz \\ Main \\ MgzApp2 \\ Content \\ elements.css –