2009-12-07 140 views
3

我以HTML和適合打印的版本顯示收據。 HTML版本可以實現jQuery標籤等,而友好的打印機具有零腳本和外部依賴關係,沒有主佈局,沒有附加按鈕,內聯CSS,並且可以毫無問題地保存爲HTML。ASP.NET MVC:渲染視圖以生成PDF:使用iTextSharp或更好的解決方案?

因爲我使用Spark View Engine,所以雖然也許使用iTextSharp引擎生成PDF是個好主意。但經過幾段我決定它太麻煩了,因爲a)我將不得不重寫整個收據(來源Spark視圖大約5頁長)b)我從頭開始就遇到過iTextSharp問題 - 例如,編號列表保持不變,沒有indentation和indentationLeft =「20」不起作用 - 可能是因爲缺少文檔,但請參閱(a)。

因此,我對PDF的要求非常簡單:我想保留相同的HTML,但在單個收據之間插入分頁符(是的,我在單個文檔中有幾個分頁符)。

是否有一種簡單的方法可以從視圖/ HTML中生成PDF,而無需使用奇怪的發動機引擎重寫視圖?

更新:嘗試社區HTMLDoc版本;沒有使用我的內聯CSS樣式,錯誤地顯示了貨幣的Unicode符號。 wkhtmltopdf確實選擇了CSS,但因貨幣符號失敗; 我想通過將charset設置爲utf-8解決了編碼問題。 wkhtmltopdf似乎很好,但我還沒有弄清楚如何設置分頁符...

+0

更不用說Java感覺的笨重端口iTextSharp的API了。 – 2009-12-07 12:42:19

回答

0

最後使用wkhtmltopdf,它在我設置編碼時工作正常,我發現如何設置分頁符,它處理我的CSS非常好。問題在於,它無法正確處理Windows版本中的標準輸入/輸出(不記得它是在進出還是不起作用) - 可能會在最近的版本中修復,但我對臨時文件還是可以的。

1

如果你可以在內存中的HTML,那麼你可以將其轉換爲PDF。我曾經使用xhtmlrenderer做過類似的事情。它是一個捆綁iText的JAVA框架,能夠將HTML流轉換爲PDF。由於它是用JAVA編寫的,因此我使用ikvmc.exe將jar文件轉換爲.NET程序集,並直接從託管代碼使用它。

+0

酷至少ikvmc鏈接,很好的東西知道。不知道我是否想要拉取所有的依賴。 – queen3 2009-12-07 12:51:42

1
public class Pdf : IPdf 
    { 
     public FileStreamResult Make(string s) 
     { 
      using (var ms = new MemoryStream()) 
      { 
       using (var document = new Document()) 
       { 
        PdfWriter.GetInstance(document, ms); 
        document.Open(); 
        using (var str = new StringReader(s)) 
        { 

         var htmlWorker = new HTMLWorker(document); 

         htmlWorker.Parse(str); 
        } 
        document.Close(); 
       } 

       HttpContext.Current.Response.ContentType = "application/pdf"; 
       HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=MyPdfName.pdf"); 
       HttpContext.Current.Response.Buffer = true; 
       HttpContext.Current.Response.Clear(); 
       HttpContext.Current.Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); 
       HttpContext.Current.Response.OutputStream.Flush(); 
       HttpContext.Current.Response.End(); 

       return new FileStreamResult(HttpContext.Current.Response.OutputStream, "application/pdf"); 
      } 
     } 
    } 
+0

+1 omu - 在尋找itextsharp pdf mvc實現時發現此問題。你找到的任何其他'不錯'的指針?曾經認爲樣式表參數的增加在make()方法中可能是有用的,但是然後我對itexsharp不太熟悉,所以不知道我是否錯過了一個技巧。我認爲這個接口是:public interface IPdf { FileStreamResult Make(string s); } – 2011-03-08 10:51:09