 <p>I can't help much without knowledge about Java <code>BufferedImage</code>,<code>Graphics</code>, <code>PrinterJob</code> and other related classes implementation. (You may start a bounty for this question to possibly draw attention of people having more intristic knowledge about java awt graphic stuff).</p> <p>As you obviously must have noticed using <code>BufferedImage</code> (or not using it) is what makes a difference in SVG output. In the version that works you draw the rectangle directly on <code>Graphic</code> context provided to you as <code>print()</code> method argument and I believe that's how it was designed to be used by authors of <code>Printable</code> interface and printing framework. </p> <p>In the second approach (that doesn't work correct) you first draw rectangle onto new <code>BufferedImage</code> object and then draw this image on the provided <code>Graphic</code> context. So you do something much less straightforward than just drawing directly on the context. There is well known truth or intuition among developers that the less straightforward way do you use some API, the bigger is a chance that you do something unexpected by its authors :(.</p> <p>My hypotesis is following: <code>BufferedImage</code> is (as you can deduce from its <a href="http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/BufferedImage.html" rel="nofollow">Javadocs</a>)just a raster image, ie. grid of pixels. That's why svg file is populated with lots of small rectangles (trying to mimic pixels). The <code>Graphics</code> object provided by <code>draw()</code> method may be more abstract and operate on shapes rather than pixels, which is much more appropriate to be written to vector graphics formats like SVG. But that's just hypotesis.</p> <p>The question is, do you really need to use <code>BufferedImage</code>? If I understand correctly, you want user to be able to edit rectangle on screen and when ready export it to SVG. Can't you just remember for example upper left corner and dimensions of rectangle edited by user and then use this data to recreate this rectangle directly on <code>Graphics</code> object provided by <code>print()</code>, like:</p> <pre><code>public int print(Graphics g, PageFormat pf, int page) throws PrinterException { ... g.fillRect(userRect.x,userRect.y,userRect.width,userRect.height); ... } </code></pre> <p>?</p> <p>(<code>userRect</code> is object of your own custom class which just stores data about image edited by user)</p>