views:

1561

answers:

3

The project I'm on is using a 3rd party component to build dynamic PDFs in a VB.Net web system called ABCpdf.Net. (not a terrible tool, but not a great one either.)

Every now and then, for reasons I can't fathom, the document object throws a SEHException. Digging futher, it turns out this is caused by a custom exception in the document object of the type WebSupergoo.ABCpdf6.Internal.PDFException. The contents contains only the not -terribly-helpful title "Unable to get image data. Out Of Memory" Usually this happens when trying to add an image to the PDF. Since these images are PNGs of less than 100k, I'm guessing their size isn't the issue.

Also, the really strange thing is that once this issue starts happening, the only way to get it to stop seems to be to reboot the web server, which is clearly a little sub-par.

Has anyone ever had this problem (or even used this tool?)

+1  A: 

I haven't specifically seen this error before, but we've had memory issues with ABC PDF before.

Long story short is that it is NOT a completely managed code base, but simply a .NET wrapper around their COM version. That being said, we traced our memory usage problem to not disposing of their objects properly.

So, instead of:


Dim doc As New Doc()
'etc...

do this:


    Dim doc as Doc
    Using doc As New Doc()
      'etc...
    End Using
Craig Wilson
so what if it isn't 100% pure managed? It implements IDisposable, you didn't dispose it. Fault's yours, you should know .NET requires careful object lifetime management.
gbjbaanb
I wasn't blaming ABC PDF. "We did not dispose of their objects properly". But, not disposing of managed resources can have a different effect than not disposing of unmanaged resources, and the effect here is that ABC PDF begins to fail.
Craig Wilson
It's also worth pointing out that the ABCpdf documentation doesn't say that it implements IDisposable, and in fact more or less states you *don't* need to dispose of the Doc object.
Electrons_Ahoy
A: 

Fascinating. I had come to the conclusion that was what must be going on. Do you still call the doc.Clear() at the end of the using block?

Electrons_Ahoy
I do not as I believe that the dispose method of Doc handles that for you.
Craig Wilson
Good to know, thanks.
Electrons_Ahoy
+1  A: 

Update, three months later:

As near as I can tell, the memory issues were all resolved when we upgraded from ABCpdf 6 to 7. It would seem that version 7 is no longer a COM object with a .NET wrapper, but all managed code from the bottom up. It's still not the greatest PDF generator out there, but the resource disposal problems seem to have been resolved.

Electrons_Ahoy