Adir.el
Adir.el

Reputation: 43

Java - Convert several strings to image format

I was looking for a way to rearrange several arguments recived as strings and one byte[] image and put them all togther as one image (jpg for example) ready to be printed (immidiatly).

example:

public static void printCard(String name, String LName, Image MainImage)

Basicly this function will be a simple card printer. I was looking for an idea or some one who can guide me, this could be very easy if some one will guide me a bit.

Upvotes: 0

Views: 200

Answers (3)

Adir.el
Adir.el

Reputation: 43

i used graphics2d to impliment my function . this method recive 2 images and 6 strings : Bufferdimage bi is my blank image, on this image i add objects (ex: image, string) :

    private static BufferedImage drawText2(BufferedImage logo,BufferedImage small,BufferedImage bi, String Headline,String outputText2,String outputText3,String outputText4,String outputText5,String outputText6) {
    Graphics2D g2d = bi.createGraphics();
    RenderingHints rh = new RenderingHints(
            RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
    g2d.setRenderingHints(rh);
    g2d.setFont(new Font("Arial", Font.BOLD, 50));
    FontMetrics fm = g2d.getFontMetrics();
    int textWidth = fm.stringWidth(Headline);
    int imageWidth = bi.getWidth();
    int leftAlignment;
    int topAlignment;

    // Align the text to the top
    topAlignment = fm.getHeight() - 10;

    // Create the text itself
    //headline
    leftAlignment = (imageWidth / 2) - (textWidth);
    g2d.setColor(Color.blue);
    g2d.drawString(Headline, leftAlignment+290, topAlignment+60);
  //property changed
    g2d.setFont(new Font("Arial", Font.BOLD, 30));
    fm = g2d.getFontMetrics();
    textWidth = fm.stringWidth(Headline);
    //second line
    textWidth = fm.stringWidth(outputText2);
    leftAlignment = (imageWidth / 2) - (textWidth);
    g2d.setColor(Color.black);
    g2d.drawString(outputText2, leftAlignment+290, topAlignment+120);
    //third line
    textWidth = fm.stringWidth(outputText3);
    leftAlignment = (imageWidth / 2) - (textWidth);
    g2d.setColor(Color.black);
    g2d.drawString(outputText3, leftAlignment+290, topAlignment+160);
    //4 line
    textWidth = fm.stringWidth(outputText4);
    leftAlignment = (imageWidth / 2) - (textWidth);
    g2d.setColor(Color.black);
    g2d.drawString(outputText4, leftAlignment+290, topAlignment+200);
  //5 line
    textWidth = fm.stringWidth(outputText5);
    leftAlignment = (imageWidth / 2) - (textWidth);
    g2d.setColor(Color.black);
    g2d.drawString(outputText5, leftAlignment+290, topAlignment+240);

    //property changed
    g2d.setFont(new Font("Arial", Font.getFont("Arial").HANGING_BASELINE, 20));
    fm = g2d.getFontMetrics();
  //security line
    textWidth = fm.stringWidth(outputText6);
    leftAlignment = (textWidth);
    g2d.setColor(Color.red);
    g2d.drawString(outputText6, 10, topAlignment+300);
    //logo
    g2d.drawImage (logo, 44, 44,180,70, null);
    //profile
    g2d.drawImage (small, 60, 120,160,190, null);
    g2d.dispose();
    return bi;
}

bi is the card with all other objects btw i added smothing to the font, without this the text is very unpleasent.

Upvotes: 0

harun
harun

Reputation: 1919

If you want to print directly from your application you can use java.awt.print package.

Try this method

public static void printCard(final String name, final String lName, final Image mainImage){

    Printable contentToPrint = new Printable(){
        @Override
        public int print(Graphics graphics, PageFormat pageFormat, int page) throws PrinterException {
            if (page > 0) {
                return NO_SUCH_PAGE;
            }
            pageFormat.setOrientation(PageFormat.PORTRAIT);
            graphics.drawImage(mainImage, 0, 0, null);
            graphics.drawString(lName, 100, 300);
            graphics.drawString(name, 100, 100);

            return PAGE_EXISTS;
        }
    };

    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(contentToPrint);
    //You can show a print dialog before printing by job by wrapping the following blocks with a conditional statement if(job.printDialog()){...}
    try {
        job.print();
    } catch (PrinterException e) {
        System.err.println(e.getMessage());
    }

}

You need to import the print related classes from java.awt.print.

Upvotes: 0

Omertron
Omertron

Reputation: 884

This is a simple method that I use to add text onto a pre-existing image.

I'm sure you can work out how to pass a blank image in and add the other lines as you see fit.

private BufferedImage drawText2(BufferedImage bi, String outputText) {
    Graphics2D g2d = bi.createGraphics();
    g2d.setFont(new Font("Helvetica", Font.BOLD, 36));
    FontMetrics fm = g2d.getFontMetrics();
    int textWidth = fm.stringWidth(outputText);
    int imageWidth = bi.getWidth();
    int leftAlignment;
    int topAlignment;

    // Align the text to the middle
    leftAlignment = (imageWidth / 2) - (textWidth / 2);

    // Align the text to the top
    topAlignment = fm.getHeight() - 10;

    // Create the drop shadow
    g2d.setColor(Color.DARK_GRAY);
    g2d.drawString(outputText, leftAlignment + 2, topAlignment + 2);

    // Create the text itself
    g2d.setColor(Color.LIGHT_GRAY);
    g2d.drawString(outputText, leftAlignment, topAlignment);

    g2d.dispose();
    return bi;
}

Upvotes: 1

Related Questions