“文档未打开”仅在使用iTextSharp的生产中出错

我在iTextSharp中收到“文档未打开”错误,但仅限于生产中。 代码在我的开发机器和分段上运行良好。 我在舞台服务器上的Temp文件夹中设置了相同的权限。

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 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中运行得很好,但它在生产中引发了错误。 有什么想法可以吗?

乍一看没有注意到,但是从上面的代码中:

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

订单需要颠倒:

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

换句话说, 尝试打开Document 之前 ,您需要PdfWriter

使用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 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文档中,正在转换为PDF,指向托管在同一服务器上的另一个网站。 服务器有内部和外部IP地址,但我忘记编辑服务器上的hosts文件,以便使用这些DNS名称重定向到自己将使用内部地址而不是外部地址。

Exception消息是“文档未打开”的原因是因为(我在这里假设),因为我在一个基本上充当“finally”语句的using块中,任何时候iText都有exception库文件关闭,当使用尝试调用Dispose(这是堆栈跟踪中显示的内容)时,iText错误输出,因为Document对象必须已经关闭。