2016-07-08 100 views
0

我正在使用iTextSharp生成PDF,并且不想在S3中将其保存到存储桶中。我不断收到像这样的错误“无法访问封闭的流”。MemoryStream关闭错误

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(); 
} 

任何想法?

/鲍勃

+0

看来iTextSharp会自行关闭流。发生异常的地方在哪里? –

+0

如果我把手表放在MS上,我会发现执行transferUtility()时会抛出异常。但是,在它实际跳转到catch句柄之前,代码会下降到newPDF.Close()。 –

+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

谢谢,伙计,我真的被卡住了。现在工作很好,欠你一个! –