内存流关闭错误

本文关键字:错误 内存 | 更新日期: 2023-09-27 17:56:09

我正在使用iTextSharp来生成PDF,并且不想将其保存到 S3 中的存储桶中。我一直收到这样的错误"无法访问关闭的流"。

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

有什么想法吗?

/鲍勃

内存流关闭错误

您使用流两次:一次用于在内存中创建 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);
    }
}