import javax.print.PrintServiceLookup;
import javax.swing.*;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
import java.io.File;

public class PrintFontSample {

    private static final String TEXT = "ABCDEF";
    private static final float FONT_SIZE = 43;

    public static void main(String[] args) throws Exception {

        if (args.length < 1) {
            System.err.printf("Provide path to the font file:%n");
            System.err.printf("  > PrintFontSample SampleBowMissedFamilyName.ttf%n");
            System.exit(1);
        }

        File fontFile = new File(args[0]);
        if (!fontFile.exists()) {
            System.err.printf("Provided font file does not exist: %s%n", args[0]);
            System.exit(1);
        }

        final Font font = Font
                .createFont(Font.TRUETYPE_FONT, fontFile)
                .deriveFont(FONT_SIZE);

        SwingUtilities.invokeAndWait(() -> {
            try {
                Printable printable = new PrintSample(font);
                PrinterJob job = PrinterJob.getPrinterJob();
                job.setPrintService(PrintServiceLookup.lookupDefaultPrintService());
                job.setPrintable(printable);
                job.print();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    static class PrintSample implements Printable {

        private final Font font;

        public PrintSample(Font font) {
            this.font = font;
        }

        @Override
        public int print(Graphics graphics, PageFormat pageFormat, int index) {
            if (index == 0) {
                drawText((Graphics2D) graphics, font, TEXT, 100, 150);
                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }

    private static void drawText(Graphics2D g, Font font, String text, int x, int y) {

        int dy = (int) FONT_SIZE + 5;

        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        int fontSize = font.getSize();

        // draw string
        g.setFont(font);
        g.drawString(text, x, y);

        // draw GlyphVector
        FontRenderContext frc = new FontRenderContext(new AffineTransform(), true, true);
        GlyphVector glyphs = font.createGlyphVector(frc, text);
        g.drawGlyphVector(glyphs, x, y + dy);

        // draw scaled GlyphVector
        glyphs = font.deriveFont(1.0f).createGlyphVector(frc, text);

        AffineTransform scale = AffineTransform.getScaleInstance(fontSize, fontSize);
        for (int i = 0; i < glyphs.getNumGlyphs(); i++) {
            glyphs.setGlyphTransform(i, scale);
        }

        g.drawGlyphVector(glyphs, x, y + 2 * dy);
    }
}
