import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.awt.geom.AffineTransform;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.awt.font.FontRenderContext;
import java.text.AttributedString;
import java.text.AttributedCharacterIterator;
import java.awt.print.PrinterJob;
import javax.swing.*;

public class Outline extends JPanel implements Printable{
    private String teststring;
    private String fontname;

    public Outline(String s[]) {
        if (s.length > 0) {
           fontname = s[0];
        } else {
           // Download from https://ipafont.ipa.go.jp/old/ipafont/download.html
           // ipam00xxx.zip
           fontname = new String("IPAMincho");
        }

        if (s.length > 1) {
           teststring = s[1];
        } else {
           teststring = "111";
        }
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setBackground(Color.white);
        Font f1 = new Font(fontname ,Font.ITALIC,60);
        g2.setFont(f1);
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
        g2.drawString(teststring,100.0f,200.0f);
    }

    public int print(Graphics g, PageFormat pf, int pi) throws PrinterException {
        if (pi > 0) {
            return Printable.NO_SUCH_PAGE;
        }
        Graphics2D g2 = (Graphics2D)g;
        Font f1 = new Font(fontname ,Font.ITALIC,60);
        g2.setFont(f1);
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
        g2.drawString(teststring,100.0f,200.0f);

        return Printable.PAGE_EXISTS;
    }

    public static void main(String s[]) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        Outline outline = new Outline(s);
        f.getContentPane().add(outline);
        f.setSize(new Dimension(400,400));
        f.setVisible(true);

        SwingUtilities.invokeLater(()->{
           PrinterJob printJob = PrinterJob.getPrinterJob();
           printJob.setPrintable(outline);
           if (printJob.printDialog()) {
               try {
                   printJob.print();
               } catch (Exception ex) {
                   ex.printStackTrace();
               }
           }
        });
    }
}
