istudent Ответов: 2

Не удается получить доступ к закрытому потоку ошибка


Я использую ItextSharp для создания pdf-файла из Html-тега.

при загрузке документа одна из моих функций перебирает и создает табличные теги для каждого раздела, которые затем передаются через ajax моему контроллеру MVC.

Для тестовой цели , когда я жесткий код написал теги таблицы и передал его, он не вызвал никакого исключения, но когда я создал теги таблицы, прокручивая dom, я получил ниже исключение.

System.ObjectDisposedException: Cannot access a closed Stream.
   at System.IO.__Error.StreamIsClosed()
   at System.IO.MemoryStream.Write(Byte[] buffer, 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.Write(PdfIndirectObject indirect, Int32 refNumber, Int32 generation)
   at iTextSharp.text.pdf.PdfWriter.PdfBody.Add(PdfObject objecta, Int32 refNumber, Int32 generation, Boolean inObjStm)
   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()


Что я уже пробовал:

Мой код таков :
[HttpPost]
        [ValidateAntiForgeryTokenAjax]
        public ActionResult CreatePdf(string htmlData)
        {
            string fileName = "BillInvoice.pdf";
            try
            {

                using (var ms = new MemoryStream())
                {
                    using (var doc = new Document(PageSize.A4, 25, 25, 25, 25))
                    {
                        using (var writer = PdfWriter.GetInstance(doc, ms))
                        {
                            doc.Open();

                            using (var srHtml = new StringReader(htmlData))
                            {
                                iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
                            }


                            CurrentHomeView = GetHomeView();
                            List<string> signBase64List = new List<string>(){
                                                                          CurrentHomeView.BillSig.GmSignature,
                                                                          CurrentHomeView.BillSig.DMSignature
                                                                        };

                            foreach (var sign in signBase64List)
                            {
                                if (!string.IsNullOrWhiteSpace(sign))
                                {
                                    string certbase64 = sign.Substring(sign.IndexOf(',') + 1);
                                    doc.Add(ConvertImage(certbase64));
                                }
                            }

                            doc.Close();
                        }
                       
                    }
                    TempData[fileName] = ms;
                    //ms.Position = 0;
                }
                return Json(new { success = true, fileName }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception e)
            {
                fileName = e.ToString();
                return Json(new { success = false, fileName }, JsonRequestBehavior.AllowGet);
            }

        }
		
		 public iTextSharp.text.Image ConvertImage(string base64String)
		{
            iTextSharp.text.Image png = null;

            Byte[] bytes = Convert.FromBase64String(base64String);
            png = iTextSharp.text.Image.GetInstance(bytes);

            return png;
        }
		
		  public ActionResult DownloadCertPdf(string fileName)
        {
            var ms = TempData[fileName] as MemoryStream;
            if (ms == null)
            {
                return new EmptyResult();
            }
            TempData[fileName] = null;
            return File(ms.ToArray(), "application/pdf", fileName);
        }

istudent

Спасибо вам, ребята, за предложение. Я реализовал его по - другому. вместо того чтобы использовать сгенерированный HTML-контент, я создал функцию для получения данных из базы данных для создания PDf-файла.

Спасибо.

2 Ответов

Рейтинг:
0

Gerry Schmitz

"DocWriter" закрывает ваш поток.

Когда другие "использования" используют предшествующие "использования", они "могут" закрыть основной поток, прежде чем вы закончите с ним.

Переосмыслите свое "использование" или поместите все выбытия в надлежащем порядке в блок "наконец".


istudent

если я это сделаю, то эта строка вызовет исключение iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);

Рейтинг:
0

Gerry Schmitz

Сделал что?

Я просто сказал, чтобы вы не "распоряжались" ресурсами, пока они вам больше не "нужны".

Ваш поток приближается "преждевременно"; это означает, что вы "заканчиваете" "использование" раньше, чем должны.