在内存流中放入多个pdf文件

本文关键字:pdf 文件 内存 | 更新日期: 2023-09-27 18:02:18

我试图采取预先存在的pdf文件,并将它们全部读入内存流,然后在teleerik pdf查看器上显示。如果我只是做一个文件,它的工作,但一旦我尝试多个文件,它给我一个内部null错误(对象ref不设置为blah blah),不能在代码中步进,看看它实际上是空的。是我做错了吗?

        List<string> applicableReports = CurrentWizard.GetApplicableReports();
        previousReportsStream = new MemoryStream();
        Stream[] streams = new Stream[applicableReports.Count];
        for (int i = 0; i < streams.Length; i++)
        {
            streams[i] = new MemoryStream(DocumentHelper.Instance.ConvertFileToByteArray(applicableReports[i]));
            streams[i].CopyTo(previousReportsStream);
        }
        RadPdfViewer radPdfViewer = new RadPdfViewer();
        RadFixedDocument document = new PdfFormatProvider(previousReportsStream, FormatProviderSettings.ReadAllAtOnce).Import();
        radPdfViewer.Document = document;

这是抛出错误的地方:

    RadFixedDocument document = new PdfFormatProvider(previousReportsStream, FormatProviderSettings.ReadAllAtOnce).Import();

docuenthelper文件到字节[]:

    public byte[] ConvertFileToByteArray(string fileName)
    {
        FileInfo fileInfo = new FileInfo(fileName);
        byte[] fileData = null; 
        using (FileStream fileStream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read))
        {
            BinaryReader binaryReader = new BinaryReader(fileStream);
            fileData = binaryReader.ReadBytes((int)fileStream.Length);
        }
        return fileData;
    }

在内存流中放入多个pdf文件

一个可能的原因是h进程内存不足,因为代码创建了许多MemoryStream对象而没有处理它们。

试着这样修改代码:

        List<string> applicableReports = CurrentWizard.GetApplicableReports();
        previousReportsStream = new MemoryStream();

        try
        {
            for (int i = 0; i < streams.Length; i++)
            {
                using( MemoryStream memStream = new MemoryStream(DocumentHelper.Instance.ConvertFileToByteArray(applicableReports[i]))
                {
                memStream.CopyTo(previousReportsStream);
                }
            }
            RadPdfViewer radPdfViewer = new RadPdfViewer();
            RadFixedDocument document = new PdfFormatProvider(previousReportsStream, FormatProviderSettings.ReadAllAtOnce).Import();
            radPdfViewer.Document = document;
       }
       finally
       {
          previousReportsStream.Close();
       }

MemoryStream实现了IDisposable接口,你可以调用dispose来释放本机资源;否则,将导致内存占用过高。