我在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中运行得很好,但是它会在生产中引发错误。有什么想法可以吗?
答案 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对象必须已经关闭。