To get the html from a page with a bookmarklet use document.documentElement.outerHTML and send the code back to the server via XHR (ajax) or via a form post.
You can show that saved HTML back to user from your site, but some links and images in the saved HTML may be broken if the URLs were relative paths. To fix that, before capturing HTML, the bookmarklet should update all URLs in the page to use full paths. Even then, images will be broken in some cases when the other server blocks hot linking of images through referrer checking or through password protection. Simple referrer checking can be fixed by having your server download all images found in the saved HTML to your local server and then rewrite the paths in the saved HTML to point to the images on your local server. You would probably also want to remove any script from the page first. There is also the problem of any frames or iframes. Frames from the same domain could be captured recursively, but frames from 3rd party sites would be unreachable by the bookmarklet.
How to automatically create a PDF or image from the saved HTML page is a separate question.
In general, when saving the HTML, there is no perfect solution. The only perfect solution would be to create an add-on, extension, or program that captures a pixel perfect image of exactly what the user is seeing. This can not be done with a bookmarklet. There are probably add-ons around that do that, and to see how they do it, you can start by digging into their source.