The information in this article applies to:
When printing text or graphics from Java using java.awt.PrintJob, the output has different font sizes, line thickness, and other Graphics attributes on different pages even when the same Graphic attributes and fonts are used on all pages.
Also, subsequent pages do not reset the offset from a previous translate call. For example, if your paint routine calls gr.translate(10,10), then the first page printed starts at origin (10,10), the second page starts at origin (20,20) and so on.
This problem happens with some printer drivers depending on whether the driver resets state between pages.
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
This bug was corrected in the Microsoft VM contained in the Microsoft® SDK for Java 3.0 and later.
To Reproduce the Font and Graphic Attribute Issue
Create a Java application and include the following class:
import java.awt.*; import com.ms.ui.*; public class PrintFont extends UIFrame { public PrintFont() { PrintJob pj = getToolkit().getPrintJob(null, "Printer", null); if (pj != null) { for (int i=1; i<=3; i++) { Graphics pg = pj.getGraphics(); if (pg != null) { pg.setFont(new Font("TimesRoman", Font.PLAIN, 16)); pg.setColor(Color.black); pg.drawRect(100, 100, 100, 100); pg.drawString("Page " + i, 600, 900); pg.drawString("TimesRoman", 500, 900); } System.out.println("Dispose"); pg.dispose(); } pj.end(); System.out.println("End"); } } public static void main(String args[]) { UIFrame f = new PrintFont(); System.exit(0); } }
A workaround for this problem is to select a different attribute (font/color) and do a drawString of an empty string, then select back in the desired attribute.
A workaround for the translation accumulation issue is to get your current translation and set the translation to the inverted values:
try { com.ms.awt.GraphicsX gx = (com.ms.awt.GraphicsX) printGraphics; Point pt = gx.getTranslation(); gx.translate(-pt.x, -pt.y); } catch (Exception e) { }
print font