I find the word "protected" totally misleading by the way. ...Does not have to do really with this thread but as protected is an access level keyword, one may think, that it protects the access in a way. In a way that it reduces it. But in reality, it widens the access (rather than protecting it), i.e. to inherited members in other packages. Example:
Frog does not compile, because of reduced visibility.
I find it just strange, that "default" is less visible than "protected". But that's only about the naming.
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