Not much difference. If you implement clone(), you should instantiate a new instance of the class and return it. In theory I suppose you could do just that (really, you CAN return any Object you want to), but what generally is done is some sort of carryover of the attributes of the class that is being cloned into a new instance of the class.
For example you have an Object that is very costly to create (new) in that case you use the clone function. The benefit is that you don�t have to go through all the trouble of creating a complex Object again.
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