Just a small note - any time you're doing casting there's something wrong with the API you're using, or you're using it wrong. The core APIs aren't immune to this (Object.equals for example - it's not possible to sensibly override that without a cast).
In other words, casting is for magicians, not programmers!
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