SecureBlackbox 16: How to Resolve OutOfMemory Errors when Loading Large PDF Documents


In this case you should handle the TElPDFDocument.OnCreateTemporaryStream and/or TElPDFDocument.PDFFile.OnCreateTemporaryStream events, create a temporary file on the disk inside the handler, and then return the corresponding FileStream/TFileStream object back to the component. If the event is not handled, a memory stream is internally created and used. This can lead to out-of-memory exceptions on large files.

The TElPDFDocument.OnCreateTemporaryStream event handler is fired when the document is loaded, and the TElPDFDocument.PDFFile.OnCreateTemporaryStream event handler is fired on saving the document when the document is reassembled (for example during document encryption).

Sample code

VCL

PDFDocument.OnCreateTemporaryStream := DoCreateTemporaryStream;
PDFDocument.PDFFile.OnCreateTemporaryStream := DoCreateTemporaryStream;

procedure TfrmMain.DoCreateTemporaryStream(Sender: TObject; var Stream:
TStream; var FreeOnClose : boolean);
begin
   Stream := TFileStream.Create(GenerateTempFilename, fmOpenReadWrite or
fmShareDenyWrite)
   FreeOnClose := True;
end;

VB.NET

AddHandler PDFDocument.OnCreateTemporaryStream, AddressOf
HandleCreateTemporaryStream ' on opening document
AddHandler PDFDocument.PDFFile.OnCreateTemporaryStream, AddressOf
HandleCreateTemporaryStream ' on saving

Private Sub HandleCreateTemporaryStream(sender As Object, ByRef stream
As IO.Stream, ByRef freeOnClose As Boolean)
   stream = New FileStream(IO.Path.GetTempFileName, FileMode.Create)
   freeOnClose = True
End Sub

We appreciate your feedback. If you have any questions, comments, or suggestions about this article please contact our support team at support@nsoftware.com.