2016-07-08 102 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

謝謝,夥計,我真的被卡住了。現在工作很好,欠你一個! –