HFE p.208 from ready state to does not exist state, we can read: ejbRemove() or timeout. Of course, we should read remove() or timeout instead, because both of them imply ejbRemove() to be called, as mentionned in the spec p.77 and p.79. Error not mentionned in o'reilly's errata pages..
I’ve looked at a lot of different solutions, and in my humble opinion Aspose is the way to go. Here’s the link: http://aspose.com