2012年11月27日火曜日

Java帳票 iTextで高解像度の画像を印刷する

  • Javaの標準の印刷 (JPS) で画像を印刷する手段は一長一短
    利点 欠点
    java.awt.print.PrinterJob? どんなプリンタでも使える 解像度が72dpi
    javax.print.DocPrinterJob? 高解像度の印刷可能 プリンタドライバによっては、直接、画像を印刷できない
  • iTextで、高解像度の画像をPDFに貼り付けて印刷すれば上手くといいな

ソースコード 

  • 1000px x 1000px の画像を PDF に貼り付けた
  • 画像の解像度は img.scalePercent(float); で指定できる。 画像を縮小するとその分解像度が上がる
    縮尺(%) 解像度(dpi)
    100f 72dpi
    50f 144dpi
    25f 288dpi
    10f 720dpi
    5f 1440dpi
  • 無指定時は 72 dpi
  • 画像の大きさ(縦横の長さ)が小さくなっても画素情報は失われない。たとえば、 (1inch x 1inch) の (1000px x 1000px) の画像になる。



package com.snail.exam.printexam;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;

public class ITextExam3 {

    public static void main(String[] args) {
        try {

            OutputStream out = new FileOutputStream("/tmp/iTextExample3.pdf");
            //ByteArrayOutputStream out = new ByteArrayOutputStream();
           
            Document doc = new Document(PageSize.A4, 50, 50, 50, 50);
            PdfWriter pdfwriter = PdfWriter.getInstance(doc, out);

            Image img = createImage();

            doc.open();
           
            doc.add(new Phrase("72dpi\n\n"));
            doc.add(img);
           
            doc.newPage();
            img.scalePercent(50f);
            doc.add(new Phrase("144dpi\n\n"));
            doc.add(img);
           
            doc.newPage();
            img.scalePercent(25f);
            doc.add(new Phrase("288dpi\n\n"));
            doc.add(img);
           
            doc.newPage();
            img.scalePercent(10f);
            doc.add(new Phrase("720dpi\n\n"));
            doc.add(img);
           
            doc.newPage();
            img.scalePercent(5f);
            doc.add(new Phrase("1440dpi\n\n"));
            doc.add(img);
           
            // Document End
            doc.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    private static Image createImage() throws IOException, BadElementException{
            BufferedImage image = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);

            Graphics2D g = image.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

            g.setColor(Color.WHITE);
            g.fillRect(0, 0, image.getWidth(), image.getHeight());

            g.setColor(Color.GRAY);
            for (int x = 0; x < image.getWidth(); x += 5) {
                g.drawLine(x, 0, x, image.getHeight());
            }
            for (int y = 0; y < image.getHeight(); y += 5) {
                g.drawLine(0, y, image.getWidth(), y);
            }

            g.setColor(Color.BLACK);
            g.setFont(new java.awt.Font(java.awt.Font.SANS_SERIF, java.awt.Font.PLAIN, 24));
            g.drawString("20pt 123 ABC あいう アイウ", 0, 20);

            g.setFont(new java.awt.Font(java.awt.Font.SANS_SERIF, java.awt.Font.PLAIN, 10));
            g.drawString("10pt 123 ABC あいう アイウ", 0, 40);

            g.setFont(new java.awt.Font(java.awt.Font.SANS_SERIF, java.awt.Font.PLAIN, 8));
            g.drawString("8pt 123 ABC あいう アイウ", 0, 60);
           
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ImageIO.write(image, "png", out);
           
            return com.itextpdf.text.Image.getInstance(out.getBytes()); 
    }
}

0 件のコメント:

コメントを投稿