2012-02-16 1 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)) 

を実行します知っています。

このコードは、開発者とステージングでうまく動作しますが、本番環境ではエラーが発生します。それがなぜ起こるのかについての考えはありますか?

+1

サーバーに一時ファイルを作成する特別な理由はありますか?それ以外の場合は、コード内の 'FileStream'を' MemoryStream'に置き換え、 'ms [ToArray()'を呼び出して 'byte []'を返してください。次に、一時ファイルを読み込んで削除する余分な手順を取り除いてから削除します。 – kuujinbo

+0

これは良い提案ですが、これまでに見たことがありますが、それは問題の原因ではありません。しかし、ありがとう。 – capn

答えて

3

、それは次のようになります。

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

声明、別の例外は、私の場合、それには、送出されていました:

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; 
    } 

問題は内部のことでしたた:

私はそれを使用していた画像がPに変換されたHTMLドキュメント、内部でリンクされたために起こった
WebException: Unable to connect to the remote server 

DFは、同じサーバー上にホストされている別のWebサイトを指していました。サーバーには内部および外部のIPアドレスがありましたが、サーバー上のhostsファイルを編集するのを忘れていました。そのため、DNS名を使用して自身にリダイレクトすると、外部のアドレスではなく内部のアドレスが使用されます。

理由は、「ドキュメントが開いていません」という理由は、基本的に「最終的に」ステートメントとして機能する使用ブロックから(FYI:私はここに仮定しています)例外はiTextライブラリ内でドキュメントが閉じ、使用がDispose(スタックトレースに現れたもの)を呼び出そうとすると、Documentオブジェクトが既に閉じられているため、iTextエラーが出ます。

13

は、一目見ただけで、それに気付かなかったが、上記のコードから:

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

順序を逆にする必要があります。つまり

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

を、次のものが必要PdfWriterの前にを試してみてください。Document

コードの改善についてkuujinboの提案を使用して3210
+0

ええ、それは別のエラーメッセージや何かを得るために別のものをいくつか試してみた後でした、私はそれを働かせました、私は答えをいくつか投稿しますが、それは間違っていました私は元に戻す必要があった。 – capn