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

时间:2012-02-16 17:08:46

标签: c# itextsharp itext

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

2 个答案:

答案 0 :(得分:13)

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

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

订单需要逆转:

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

换句话说,您需要{/ 1}} 之前尝试打开PdfWriter

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

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