2017-08-03 42 views
0

我一直在尝试使用各种方法将大型PdfDocument保存到字节数组中,但始终回到内存不足异常(文件是200 MB和2.5K页)。Large PDFsharp(MigraDoc)PdfDocument to byte []

我最初的尝试是简单地使用的MemoryStream

public static byte[] ProcessLargePdfDocument(PdfDocument pdfDocument) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     pdfDocument.Save(stream, true); 
     return stream.ToArray(); 
    } 
} 

然后,我尝试在一些缓冲加入

public static byte[] ProcessLargePdfDocument(PdfDocument pdfDocument, long whereToStartReading = 0) 
{ 
    List<byte> byteList = new List<byte>(); 

    using (MemoryStream stream = new MemoryStream()) 
    { 
     pdfDocument.Save(stream, false); 
     byte[] buffer = new byte[megabyte]; 
     stream.Seek(whereToStartReading, SeekOrigin.Begin); 
     int bytesRead = stream.Read(buffer, 0, megabyte); 
     while (bytesRead > 0) 
     { 
      byteList.AddRange(buffer); 
      bytesRead = stream.Read(buffer, 0, megabyte); 
     } 
    } 

    return byteList.ToArray(); 
} 

无论我怎么努力,我得到一个内存不足的异常在pdfDocument.Save呼叫。我可以将它写入文件位置,并在dev中使用缓冲的FileStream将其读回,但由于权限(尚未),我无法在生产环境中执行此操作。

回答

1

两个小技巧:

确保你的进程作为一个64位的过程,允许它使用的RAM超过2吉布。

stream.ToArray()创建副本,stream.GetBuffer()让您访问MemoryStream的内部缓冲区。如果在Save()之后发生异常,这可能会有所作为。