Emo*_*mon 5 c# itextsharp objectdisposedexception winforms
我在Windows窗体程序中遇到了来自iTextSharp的HTMLWorker.Parse问题.每当我执行代码并从HTMLWorker.Parse开始时,它都会给出objectDisposedException.例外情况说它无法访问已关闭的文件.但我检查了很多次,找不到关闭的文件.这是代码:
class HtmlToPdfConverter
{
private iTextSharp.text.Document doc = new iTextSharp.text.Document();
public HtmlToPdfConverter()
{
this.doc.SetPageSize(PageSize.A4);
}
public string Run(string html, string pdfName)
{
try
{
using (doc)
{
StyleSheet styles = new StyleSheet();
using (PdfWriter writer = PdfWriter.GetInstance(this.doc, new FileStream(@"Z:\programs\" + pdfName + ".pdf", FileMode.Create)))
{
this.doc.Open();
this.doc.OpenDocument();
this.doc.NewPage();
if (this.doc.IsOpen() == true)
{
StringReader reader = new StringReader(html);
//XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, reader);
this.doc.Add(new Paragraph(" "));
HTMLWorker worker = new HTMLWorker(this.doc);
worker.Open();
worker.StartDocument();
worker.NewPage();
worker.Parse(reader);
worker.SetStyleSheet(styles);
List<IElement> ie = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(reader, null);
foreach (IElement element in ie)
{
this.doc.Add((IElement)element);
}
worker.EndDocument();
worker.Close();
}
}
}
return string.Empty;
}
catch (Exception ex)
{
return ex.Message;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是例外:
System.ObjectDisposedException was caught
Message=Cannot access a closed file.
Source=mscorlib
ObjectName=""
StackTrace:
at System.IO.__Error.FileNotOpen()
at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
at iTextSharp.text.pdf.OutputStreamCounter.Write(Byte[] buffer, Int32 offset, Int32 count)
at iTextSharp.text.pdf.PdfIndirectObject.WriteTo(Stream os)
at iTextSharp.text.pdf.PdfWriter.PdfBody.Add(PdfObject objecta, Int32 refNumber, Boolean inObjStm)
at iTextSharp.text.pdf.PdfWriter.PdfBody.Add(PdfObject objecta, Int32 refNumber)
at iTextSharp.text.pdf.PdfWriter.PdfBody.Add(PdfObject objecta, PdfIndirectReference refa)
at iTextSharp.text.pdf.PdfWriter.AddToBody(PdfObject objecta, PdfIndirectReference refa)
at iTextSharp.text.pdf.Type1Font.WriteFont(PdfWriter writer, PdfIndirectReference piref, Object[] parms)
at iTextSharp.text.pdf.FontDetails.WriteFont(PdfWriter writer)
at iTextSharp.text.pdf.PdfWriter.AddSharedObjectsToBody()
at iTextSharp.text.pdf.PdfWriter.Close()
at iTextSharp.text.DocWriter.Dispose()
at WebPageExtraction.HtmlToPdfConverter.Run(String html, String pdfName)
InnerException:
Run Code Online (Sandbox Code Playgroud)
您正在尝试在已经处置后调用close方法.
你有一个using自动处理对象的块,所以只需删除这两行:
doc.CloseDocument();
doc.Close();
Run Code Online (Sandbox Code Playgroud)
如果您不相信内部配置代码正确关闭文档并且想要自己完成,请在using块内执行:
using (doc)
{
StyleSheet styles = new StyleSheet();
using (PdfWriter writer = PdfWriter.GetInstance(this.doc, new FileStream(@"Z:\programs\" + pdfName + ".pdf", FileMode.Create)))
{
//.....
}
doc.CloseDocument();
doc.Close();
}
Run Code Online (Sandbox Code Playgroud)
编辑:在为自己尝试代码后,我发现了一些问题并找到了错误的真正原因:
doc并且从不创建新实例.完整的固定代码:
Document doc = new Document();
StyleSheet styles = new StyleSheet();
string filePath = @"Z:\programs\" + pdfName + ".pdf";
using (FileStream pdfStream = new FileStream(filePath, FileMode.Create))
{
using (PdfWriter writer = PdfWriter.GetInstance(doc, pdfStream))
{
writer.CloseStream = false;
doc.Open();
doc.OpenDocument();
doc.NewPage();
if (doc.IsOpen() == true)
{
using (StringReader reader = new StringReader(html))
{
//XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, reader);
doc.Add(new Paragraph(" "));
using (HTMLWorker worker = new HTMLWorker(doc))
{
worker.Open();
worker.StartDocument();
worker.NewPage();
worker.Parse(reader);
worker.SetStyleSheet(styles);
List<IElement> ie = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(reader, null);
foreach (IElement element in ie)
{
doc.Add((IElement)element);
}
worker.EndDocument();
worker.Close();
}
}
}
writer.Close();
}
}
doc.CloseDocument();
doc.Close();
doc.Dispose();
Run Code Online (Sandbox Code Playgroud)