2017-08-03 45 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()之後發生異常,這可能會有所作爲。