大型 PDFSharp (MigraDoc) PDFDocument 到字节
Large PDFsharp (MigraDoc) PdfDocument to byte[]
我一直在尝试使用各种方法将大型 PdfDocument 保存到字节数组中,但总是返回内存不足异常(文件为 200 MB 和 2.5K 页)。
我最初的尝试是简单地使用 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 调用中遇到内存不足异常。我可以将它写入文件位置并在开发中使用缓冲的 FileStream 将其读回,但由于权限原因我无法在生产环境中执行此操作(目前)。
两个提示:
确保您的进程作为 64 位进程运行,以允许它使用超过 2 GiB 的 RAM。
stream.ToArray()
创建一个副本,stream.GetBuffer()
允许您访问 MemoryStream
的内部缓冲区。如果异常发生在 Save()
之后,这可能会有所不同。
我一直在尝试使用各种方法将大型 PdfDocument 保存到字节数组中,但总是返回内存不足异常(文件为 200 MB 和 2.5K 页)。
我最初的尝试是简单地使用 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 调用中遇到内存不足异常。我可以将它写入文件位置并在开发中使用缓冲的 FileStream 将其读回,但由于权限原因我无法在生产环境中执行此操作(目前)。
两个提示:
确保您的进程作为 64 位进程运行,以允许它使用超过 2 GiB 的 RAM。
stream.ToArray()
创建一个副本,stream.GetBuffer()
允许您访问 MemoryStream
的内部缓冲区。如果异常发生在 Save()
之后,这可能会有所不同。