2010-05-28 21 views
2

我有兩個部分關於使用iTextSharp的問題。我已經構建了一個簡單的MVC應用程序,用於在SQL Server數據庫中存儲有關「經驗教訓」的信息。當用戶查看課程的詳細信息時,我希望他們能夠將課程保存爲PDF。我有一些工作代碼,但1)我不知道我的方法是多麼的健全,2)MVC應用程序使用TinyMCE富文本編輯器,當我將豐富的文本放入PDF時,html標籤正在顯示。如何獲得PDF以兌現html格式(粗體字體,無序列表,段落等)?使用iTextSharp與MVC

下面是我用來生成PDF的代碼。如果我錯誤地回答這個問題,我會非常感激。

謝謝。

public FilePathResult GetPDF(int id) 
    { 
     Lesson lesson = lessonRepository.GetLesson(id); 

     string pdf = @"C:\Projects\Forms\LessonsLearned\PDF\template_test.pdf"; 
     string outputFilePath = @"C:\Temp\pdf_output\test_template_filled.pdf"; 

     PdfReader pdfReader = null; 

     try 
     { 

      pdfReader = new PdfReader(pdf); 

      using (FileStream pdfOutputFile = new FileStream(outputFilePath, FileMode.Create)) 
      { 
       PdfStamper pdfStamper = null; 
       try 
       { 
        pdfStamper = new PdfStamper(pdfReader, pdfOutputFile); 

        AcroFields acroFields = pdfStamper.AcroFields; 

        acroFields.SetField("title", lesson.Title); 
        acroFields.SetField("owner", lesson.Staff.FullName); 
        acroFields.SetField("date", lesson.DateEntered.ToShortDateString()); 
        // field with rich text      
        acroFields.SetField("situation", Server.HtmlDecode(lesson.Situation)); 
        acroFields.SetField("description", Server.HtmlDecode(lesson.Description)); 

        pdfStamper.FormFlattening = true; 

       } 
       finally 
       { 
        if (pdfStamper != null) 
        { 
         pdfStamper.Close(); 
        } 
       } 
      } 
     } 
     finally 
     { 
      pdfReader.Close(); 
     } 

     return File(outputFilePath, "application/pdf", "Lesson_" + lesson.ID + ".pdf"); 

    } 

回答

3

我想改變的方法的唯一主要組件是數據返回的方式。現在你正在使用一個固定的文件路徑,這意味着兩個人同時發出請求會導致其中一個出錯。由於您未保存文件供以後使用,因此我會完全跳過FileStream並使用MemoryStream。然後,您可以使用FileStreamResult返回MIME類型爲application/pdf的流。

對於第二部分你會遇到一些麻煩。 PDF和HTML不相關,所以HTML標籤(只是純文本)在PDF文檔中沒有特殊含義。如果您想將用戶HTML(由富文本控件生成)轉換爲合適的PDF富文本,您需要在中間使用HTML解析器。

iText包含HTMLWorker類,它是一個部分 HTML分析器(意思是它不會處理所有html標記或結構),旨在返回與PDF兼容的塊。你也可以使用類似HTMLAgilityPack的東西來更好地控制哪些標籤被轉換,但是你必須自己做翻譯。您還可以檢查您的富文本編輯控件,以查看它是否可以以更易於解析的格式返回富文本。

+0

感謝您的回覆David。是的,我很擔心FileStream。我希望能夠打開模板PDF並使用我的數據庫中的數據填充它,但正如您所說,我不需要保存生成的文件供以後使用。你有可以分享的任何示例代碼嗎?我只是一種黑客一起。 在HTML標籤前面 - 我將嘗試HTMLWorker類。 – user353024 2010-05-28 16:20:57

+0

我有HTMLWorker類解析HTML,但我不明白的是,如果可以格式化PDF中的文本,使其看起來類似於HTML中的外觀...請需要建議! – user353024 2010-05-28 18:11:19