2016-07-08 10 views
0

私はPDFを生成するためにiTextSharpを使用していますが、それを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

ありがとう、私は本当に立ち往生していた。今すぐ素晴らしい仕事をしてください! –