FIX: PrintJob Output is Incorrect After First Page

ID: Q182623


The information in this article applies to:


SYMPTOMS

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.


CAUSE

This problem happens with some printer drivers depending on whether the driver resets state between pages.


STATUS

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 virtual machine contained in the SDK for Java 3.0 and later.


MORE INFORMATION

Steps 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) {

} 

Additional query words: print font


Keywords          : kbSDKJava300fix kbDSupport JVM kbSDKJava310fix 
Version           : WINDOWS:1.1,2.0,2.01
Platform          : WINDOWS 
Issue type        : kbbug 

Last Reviewed: July 26, 1999