概要

ソースコード

1000px x 1000px の画像を作成し、それを 451px x 698px に縮小して印刷

package com.snail.exam.printexam;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;

public class AWTPrintExam {

    private static final double CM = 72.0 / 2.54;

    public static void main(String[] args) {
        try {
            // A4横
            Paper PAPER = new Paper();
            PAPER.setSize(21.0 * CM, 29.5 * CM);
            PAPER.setImageableArea(
                    1.5 * CM,
                    1.5 * CM,
                    17.0 * CM,
                    27.0 * CM);
            PageFormat pageFormat = new PageFormat();
            pageFormat.setPaper(PAPER);
            // pageFormat.setOrientation(PageFormat.LANDSCAPE); // こっちで指定しても反映されない PrintRequestAttributeSet に指定

            // 描画クラス
            Printable printable = new Printable() {

                @Override
                public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
                    if (pageIndex > 0) {
                        return NO_SUCH_PAGE;
                    }
                    try {
                        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 Font(Font.SANS_SERIF, Font.PLAIN, 24));
                        g.drawString("20pt 123 ABC あいう アイウ", 0, 20);

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

                        g.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 8));
                        g.drawString("8pt 123 ABC あいう アイウ", 0, 60);

                        System.out.println("余白(左): " + (int) pageFormat.getImageableX() + "px");
                        System.out.println("余白(上): " + (int) pageFormat.getImageableY() + "px");
                        System.out.println("印刷領域: " 
                                + (int) pageFormat.getImageableWidth() + "px x " 
                                + (int) pageFormat.getImageableHeight() + "px");
                        
                        graphics.drawImage(
                                image
                                , (int) pageFormat.getImageableX()
                                , (int) pageFormat.getImageableY()
                                , (int) pageFormat.getImageableHeight()
                                , (int) pageFormat.getImageableWidth()
                                , null);

                        return PAGE_EXISTS;
                    } catch (Exception e) {
                        return NO_SUCH_PAGE;
                    }
                }
            };


            // プリンタを列挙            
            PrintService[] services = PrinterJob.lookupPrintServices();

            // 最初に見つかったプリンタをデフォルト値として印刷ダイアログを立ち上げる
            if (services.length > 0) {

                // PrintJob
                PrinterJob printJob = PrinterJob.getPrinterJob();
                printJob.setPrintable(printable, pageFormat);
                printJob.setPrintService(services[0]);
                printJob.setCopies(1);

                // aset に指定した属性のうち、用紙の向きだけ有効になる
                PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
                aset.add(OrientationRequested.LANDSCAPE);
                if (printJob.printDialog(aset)) {
                    printJob.print(aset);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

実行結果

imgb.png

ぼやけている。10ptの文字は判別できない


Java#Print


添付ファイル: fileimgb.png 2150件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2011-05-24 (火) 00:33:16 (4891d)
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=c16bdebff3
ISBN10
ISBN13
9784061426061