Mac OS X Java application does not print fonts correctly

I recently found out that the icon printing program that I wrote, which has been working on windows for many years, does not print correctly on MAC OS X. I use the font Arial truetype. It seems that the program displays the main font without proper scaling. I am using intellij and jdk1.7.0_15. The font is displayed correctly on the screen, but not when printing to a printer or in pdf format. When I list the fonts available for the program on the console using GraphicsEnvironment.getAvailableFontFamilyNames, Arial is listed as one of them. When I load a font from a font file directly, it works correctly. I've been chasing my tail all day, any suggestions will be appreciated. Here is the code that demonstrates my problem ...

/** * DisplayPage.java */ import java.awt.*; import java.awt.print.*; public class DisplayPage extends ApplicationFrame { public static void main(String[] args) { // Create app and display draw page DisplayPage f = new DisplayPage(); f.setTitle("PaintingAndStroking v1.0"); f.setSize(850, 1100); f.center(); f.setVisible(true); // Generate print job to print page PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(new PrintPage()); boolean doPrint = pj.printDialog(); if (doPrint) { try { pj.print(); } catch (PrinterException e) { System.out.println(e); } } } /** * This is called by the windows event processor * @param g java.awt.Graphics context for display */ public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D)g; DrawPage.draw(g2d); } } /** * ApplicationFrame.java */ import java.awt.*; import java.awt.event.*; public class ApplicationFrame extends Frame { public ApplicationFrame() { this("ApplicationFrame v1.0"); } public ApplicationFrame(String title) { super(title); setSize(850, 1100); center(); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); } public void center() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = getSize(); int x = (screenSize.width - frameSize.width) / 2; int y = (screenSize.height - frameSize.height) / 2; setLocation(x, y); } } /** * PrintPage.java */ import java.awt.*; import java.awt.print.*; public class PrintPage implements Printable { public int print(Graphics g, PageFormat pf, int page) throws PrinterException { // We have only one page if (page > 0) { return NO_SUCH_PAGE; } // Create Graphics2D context Graphics2D g2d = (Graphics2D)g; // Draw page DrawPage.draw(g2d); // Verify page exists return PAGE_EXISTS; } } /** * DrawPage.java */ import java.awt.*; public class DrawPage { static public void draw(Graphics2D g2d) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); Font[] fonts = ge.getAllFonts(); String[] fontFamilies = ge.getAvailableFontFamilyNames(); for (int i=0; i<fontFamilies.length; i++) { System.out.println(fontFamilies[i]); } double x = 15, y = 50, w = 70, h = 70; GradientPaint gp = new GradientPaint(75, 75, Color.white, 95, 95, Color.gray, true); // Fill with a gradient g2d.setPaint(gp); // Stroke with a solid color. g2d.setPaint(Color.black); g2d.setStroke(new BasicStroke(8)); // Stroke with a gradient. g2d.setPaint(gp); // Draw text string String text = new String("This is a test..."); g2d.setPaint(Color.black); g2d.setStroke(new BasicStroke(8)); Font font = new Font("Arial", Font.PLAIN, 36); g2d.setFont(font); g2d.drawString("This is a test of Arial 36", 50, 100); font = new Font("Arial", Font.PLAIN, 72); g2d.setFont(font); g2d.drawString("This is a test of Arial 72", 50, 200); } } 
+4
source share
3 answers

I wrote a blog post about this Printing is damaged on Mac OS X with Java 7 , which includes everything I found, including the cause, error reports, and also our workaround for now. The short option is that it looks like a bug in Apple Mac OS or Java 7, and at the time of this writing, it has not yet been fixed.

+1
source

There is a workaround for this problem. Font display issues are caused by an error with the implementation of Graphics.drawString ().

Two approaches to avoid this:

  • You can replace your calls with Graphics.drawString (...) with a call like this

    • Graphics.drawGlyphVector (Graphics.getFont (). CreateGlyphVector (Graphics.getFontRenderingContext (), String.toCharArray ()))
  • You can provide your own implementation of Graphics2D, which overrides the drawString () methods and performs the above conversion and delegates drawGlyphVector ()

Using drawGlyphVector () will cause the text to be displayed with Java AWT code, rather than rendering its own OS, so there may be some visual artifacts and performance degradation. But this is much better than the current situation.

+1
source

I had the same problem as you. I downgraded the Java version to 1.6 from 1.7 using these instructions.

http://support.apple.com/kb/HT5559?viewlocale=en_US

This is not the best solution, but you can solve your problem.

0
source

All Articles