2016-07-08 2 views
0

Я использую iTextSharp для создания PDF и wan't, чтобы сохранить его в ведро в S3. Я продолжаю получать ошибки, подобные этому: «Невозможно получить доступ к закрытому потоку».Ошибка памятиStream закрыта

using (MemoryStream ms = new MemoryStream()) 
{ 
    PdfWriter outputWriter = PdfWriter.GetInstance(newPDF, ms); 
    newPDF.Open(); 
    PdfContentByte cb1 = outputWriter.DirectContent; 
    for (int pagesToAddFromSourcePDFToNewPDF = 0; pagesToAddFromSourcePDFToNewPDF < soa_total_pages; pagesToAddFromSourcePDFToNewPDF++) 
    { 
     if (pagesToAddFromSourcePDFToNewPDF > 0) 
     { 
      currentPageInSourcePDF++; 
     } 

     newPDF.NewPage(); 
     PdfImportedPage page = outputWriter.GetImportedPage(sourcePDF, currentPageInSourcePDF); 
     cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
    } 

    filesCreated++; 
    // Upload stream to AWS 
    ms.Position = 0; 
    using (var transferUtility = new TransferUtility(client)) 
    { 
     transferUtility.Upload(ms, "mybucketname", "1/soa/" + newPDFFilename); // ERROR IS THROWN HERE 
    } 

    newPDF.Close(); 
} 

Любые идеи?

/Bob

+0

Кажется, iTextSharp закрывает поток сам по себе. Где именно происходит исключение? –

+0

Если я поставлю часы на MS, я вижу, что это исключение вызывается при выполнении функции transferUtility(). Но код переходит к newPDF.Close(), прежде чем он действительно перейдет к ручке catch. –

+0

Обратите внимание, что если я использую FileStream, он работает как шарм. Но это когда я экономию локально для тестирования. –

ответ

2

Вы используете поток дважды: один раз, чтобы создать PDF в памяти, и второй раз, чтобы загрузить его. Повторное использование потока может быть проблематичным, если вы не знаете, что с ним происходит с помощью абстракций (в данном случае iTextSharp). Вместо этого преобразуйте поток в массив байтов и создайте новый поток из массива.

byte[] bytes; 

using (MemoryStream ms = new MemoryStream()) 
{ 
    PdfWriter outputWriter = PdfWriter.GetInstance(newPDF, ms); 
    newPDF.Open(); 
    PdfContentByte cb1 = outputWriter.DirectContent; 

    for (int pagesToAddFromSourcePDFToNewPDF = 0; pagesToAddFromSourcePDFToNewPDF < soa_total_pages; pagesToAddFromSourcePDFToNewPDF++) 
    { 
     if (pagesToAddFromSourcePDFToNewPDF > 0) 
     { 
      currentPageInSourcePDF++; 
     } 

     newPDF.NewPage(); 
     PdfImportedPage page = outputWriter.GetImportedPage(sourcePDF, currentPageInSourcePDF); 
     cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
    } 

    newPDF.Close(); 

    bytes = ms.ToArray(); 
} 

filesCreated++; 

using (var ms = new MemoryStream(bytes)) 
{ 
    // Upload stream to AWS 
    using (var transferUtility = new TransferUtility(client)) 
    { 
     transferUtility.Upload(ms, "mybucketname", "1/soa/" + newPDFFilename); 
    } 

} 
+1

Спасибо, мужик, я действительно застрял. Прекрасно работай, ты должен один! –

Смежные вопросы