Tengo un problema con HTMLWorker.Parse de iTextSharp en un programa de formulario de Windows . Cada vez que exijo el código y comienza con HTMLWorker.Parse, le da la objectDisposedException. La excepción dice que no puede acceder a un archivo cerrado. Pero revisé muchas veces y no puedo encontrar el archivo que está cerrado. Aquí está el código:Itextsharp HTMLWorker.Parse error
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;
}
}
}
Ésta es la excepción:
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:
añadí esos doc.close y .closeDocument como extra para mirar si eso iba a funcionar. He intentado con tu solución, pero todavía no funciona. Gracias por ayudar. – Emon
Sí, encontré el verdadero motivo. Ver mi edición El cambio crítico es agregar 'writer.CloseStream = false;' –
Ahora ofrece otra excepción. es la webexcepción. dice que no puede encontrar la ruta de red. Esta versión también se detiene en worker.parse, ¿sabes si hay algún problema con ese método en iTextSharp? Ya no da la otra excepción. Gracias por ayudarme. – Emon