2012-02-16 31 views
3

iTextSharp中出現「文檔未打開」錯誤,但僅在生產中出現。代碼在我的開發機器和分期中運行良好。我在舞臺服務器的Temp文件夾中設置了相同的權限。僅在使用iTextSharp進行生產時出現「文檔未打開」錯誤

public static byte[] ConvertHtmlToPdf(string html) 
    { 
     html = HtmlPostProcessor.Process(html); 
     byte[] fileData = null; 
     string tempPath = ConfigurationManager.AppSettings["TempDirectory"]; 
     string tempPDFFile = Path.Combine(tempPath, Guid.NewGuid() + ".pdf"); 
     int num = FontFactory.RegisterDirectory(@"C:\Windows\Fonts"); 

     using (FileStream fs = new FileStream(tempPDFFile, FileMode.Create)) 
     { 
      using (Document document = new Document(PageSize.LETTER, 50, 50, 50, 50)) 
      { 
       document.Open(); 
       PdfWriter.GetInstance(document, fs); 
       using (StringReader stringReader = new StringReader(html)) 
       { 

        List<IElement> parsedList = HTMLWorker.ParseToList(stringReader, null); 
        foreach (IElement item in parsedList) 
        { 
         document.Add(item); 
        } 
       } 
      } 
     } 

     FileStream generatedPDF = File.Open(tempPDFFile, FileMode.Open); 
     fileData = new byte[(int)generatedPDF.Length]; 
     int result = generatedPDF.Read(fileData, 0, (int)generatedPDF.Length); 

     generatedPDF.Close(); 

     File.Delete(tempPDFFile); 

     return fileData; 
    } 

一個PDF文件時生成,所以我知道它跑過

using (FileStream fs = new FileStream(tempPDFFile, FileMode.Create)) 

至少是。

此代碼在dev和staging中運行得很好,但它在生產中會引發錯誤。任何想法,爲什麼這可能是?

+1

是否有一個特定的原因,你正在服務器上創建一個臨時文件?否則,只需用'MemoryStream'替換代碼中的'FileStream',然後調用'ms.ToArray()'返回'byte []'。然後,你也消除了必須讀取臨時文件,然後刪除它的額外步驟... – kuujinbo 2012-02-16 21:19:53

+0

它的一個很好的建議,以及我之前見過的建議,但是這不是什麼原因造成的問題。不過謝謝。 – capn 2012-02-17 19:00:45

回答

3

使用大約提高了代碼kuujinbo的建議,現在看起來是這樣的:

public static byte[] ConvertHtmlToPdf(string html) 
    { 
     html = HtmlPostProcessor.Process(html); 
     byte[] fileData = null; 
     int num = FontFactory.RegisterDirectory(@"C:\Windows\Fonts"); 

     using (MemoryStream ms = new MemoryStream(html.Length)) 
     { 
      using (Document document = new Document(PageSize.LETTER, 50, 50, 50, 50)) 
      { 
       PdfWriter.GetInstance(document, ms); 
       using (StringReader stringReader = new StringReader(html)) 
       { 

        List<IElement> parsedList = HTMLWorker.ParseToList(stringReader, null); 
        document.Open(); 
        foreach (IElement item in parsedList) 
        { 
         document.Add(item); 
        } 
       } 
      } 

      fileData = ms.ToArray(); 
     } 
     return fileData; 
    } 

的問題是,裏面的:

using (Document document = new Document(PageSize.LETTER, 50, 50, 50, 50)) 

聲明,另一個異常被拋出,在我的情況下,它是:

WebException: Unable to connect to the remote server 

發生這是因爲我正在使用的圖像鏈接在HTML文檔內部,這被轉換爲P DF正在指向另一個託管在同一臺服務器上的網站。服務器有內部和外部IP地址,但我忘記編輯服務器上的主機文件,以便使用這些DNS名稱重定向到自身將使用內部地址而不是外部地址。

異常消息是「文檔未打開」的原因是因爲(我在這裏假設)因爲我處於基本上充當「最終」語句的使用塊中,所以任何時候都有一個文檔關閉的iText庫中的異常,以及何時使用嘗試調用Dispose(這是堆棧跟蹤中顯示的內容),因爲Document對象必須已關閉,所以iText出錯。

13

沒有第一眼看到它,但是從上面的代碼:需要

document.Open(); 
PdfWriter.GetInstance(document, fs); 

順序應當顛倒:

PdfWriter.GetInstance(document, fs); 
document.Open(); 

換句話說,你需要PdfWriter之前您試試並打開Document

+0

是的,那是在我嘗試了幾種不同的事情來讓它變得不同以獲得另一個錯誤信息或其他東西之後,我得到了它的工作,我會在幾個地方發佈答案,但那是錯誤的我必須撤消。 – capn 2012-02-17 20:49:43

相關問題