Printing

|
Printing
1. 프린팅에 관련된 기본적인 개념
2. 새로운 프린팅 기능에 사용되는 다양한 클래스
3. 방향(Orientation)과 같은 프린터 옵션 선택
4. 프린팅 작업의 시작과 종료
5. 미리보기와 같은 기본적인 프린팅 기능
 
지원 프린팅 기능
1. 인치당 72dot(DPI)의 해상도를 지원한다.
지원클래스
----------------------------------------------------------------------------------------
|이름            |타입          |목적                                                                                      |
|---------------------------------------------------------------------------------------
|Paper          |클래스       | 용지타입의 물리적인 특징을 나타낸다.                                       |
|PageFormat  |클래스       | 프린트될 페이지의 크기와 방향을 나타낸다.                                |
|Book           |클래스       | Pageable 인터페이스를 편리하게 구현한다.                                |
|Printable      |인터페이스 | 하나의 Printable 페이지를 나타낸다.                                          |
|Pageable     |인터페이스 | Printable 페이지들의 콜렉션을 나타낸다.                                    |
---------------------------------------------------------------------------------------
Paper
1. 프린트될 용지의 물리적인 크기
2. 이미지를 생성할 수 있는 영역의 크기와 위치
● getWidth(), getHeight(), getSize()
● setImageableArea(), getImageableX(), getImageableY(),
 getImageableWidth(), getImageableHeight()
 -이미지를 생성할 수 있는영역의 크기와 위치를 수정하고 쿼리할 수 있게 해준다.
● setImageableArea()
 double paper Width=8.5 * 72;
 double paperHeight=11*72;
 double xMargin=1.0*72;
 double yMargin=1.5*72;
 double areaWidth=paperWidth ? (xMargin *2);
 double areaHeight=paperHeight ? (yMargin *2);
 Paper p = new Paper();
 p.setImageableArea(xMargin, yMargin, areaWidth, areaHeight);
● clone()
 이 메소드는 Paper 객체의 복사본을 만들 때 사용
 
[ PageFormat ]
Paper가 프린팅에 사용되는 용지의 물리적인 속성을 나타낸다면, 이 클래스는
 하나 이상 프린트되는 논리적인 성질을 나타낸다. 프린팅시 사용되는 초기값에
의존하면 물리적인 속성값과 논리적인 속성이 동일하다.
Printable 구현이 페이지에 대한 이미지를 생성할 수 있는 영역의 크기와
 위치를 결정하고, 각각의 영역에 대한 랜더링의 범위를 한정하기 위해 print()
 메소드가 호출될 때 pageFormat의 인스턴스가 전달된다.
● setOrientation(), getOrientation()
pageFormat 객체를 사용하여 프린트될 페이지에 대한 초기값을 수정하고
 쿼리할 수 있게 해준다. 방향은 pageFormat 에 정의된 다음 상수 중 하나의
 일치하는 int값으로 포함되어 있다.
(PORTRAIT, LANDSCAPE, REVERSE_LANDSCAPE)
● getPaper(), setPaper()
pageFormat 은 Paper 객체에 대한 레퍼런스를 포함하고, 이 메소드들은 객체의 복사본을 얻거나 대치하게 한다.(default 는 US letter size)
 - getPaper()는 pageFormat의 Paper 객체의 레퍼런스가 아닌 복사본을 반환한다.
 - 용지의 크기나 이미지를 생성할 수 있는 영역값을 수정하고자 한다면 getPaper() 를 호출하고, 반환된 객체를 수정한 후에 setPaper()를 호출하여 PageFormat의 레퍼런스를 업데이트해야 한다.
 
Pageformat pf = new pageFormat();
Paper p = pf.getPaper();
p.setImageableArea(0, 0, p.getWidth(), p.getHeight());
pf.setPaper(p);
● getMatrix()
 프린트시 방향이 올바르게 하기 위해 이미지를 적절히 회전하는 데 사용되는 행열을반환.
● getWidth(), getHeight()
 용지의 논리적인 크기를 반환하고, Paper에서 같은 이름을 가진 메소드는 물리적인 크기를 반환한다.
● getImageableX(), getImageableY(), getImageableWidth(), getImageableHeight()
● clone()
 
[ Printable ]
 프린트될 출력을 생성할 수 있는 개체를 나타내고 하나의 메소드를 정의한다.
 ● print()
 Printable 구현이 출력 페이지를 랜더링하도록 하기 위해 프린트하는 동안에 한번 이상 호출된다.
프린트하는 동안에 한번 이상 호출된다. 3개의 파라미터값이 적절한 랜더링을 수행하도록 print()에 전달된다.
 - 랜더링될 페이지를 나타내는 Graphics 객체
 - 프린트를 수행할 용지의 논리적인 성질을 설명하는 PageFormat객체
 - 랜더링할 페이지를 나타낼 정수값, 하나의 Printable 인스턴스가 여러 페이지를 프린트할 수 있기 때문에 필요하다.
public int print(Graphics g, PagerFormat pagerFormat, int pageNumber){
 if(pageNumber == 0){
  return Printable.PAGE_EXISTS;
 }
 else{
  return Printable_NO_SUCH_PAGE;
 }
}
 
[ Pageable ]
PrinterJop 의 setPrintable()메소드는 Printable/PageFormat쌍을 지정할 수 있게 해주고, 이 두 객체는 프린트될 모든 페이지를 랜더링하는데 사용된다.
● getPrintable()
 페이지수가 주어지면, 이 메소드는 페이지를 랜더링하는 Printable구현을 반환한다.
● getPageFormat()
 페이지수가 주어지면, 이 메소드는 페이지를 랜더링하는 Pringable구현을 반환한다.
 ● getPageFormat()
  페이지 수가 주어지면 이 메소드는 페이지의 논리적인 성질을 나타내는 PageFormat을 반환한다.
 ● getNumberOfPages()
  Pageable 객체에 의해 캡슐화된 페이지 수를 나타내는 int 을 반환, 프린팅이 시작되기 전에 페이지 수를  알 수 없는 경우가 있다. 그럴 경우는(UNKNOWN_NUMBER_OF_PAGES를 반환한다.
 
 [ Book ]
 Pageable 인터페이스의 구현이고 Printable/PageFormat 객체쌍을 콜렉션에 추가하게 해주는
  메소드들을 정의한다. Pageable에 정의된 3개의 메소드 외에 Book은 다음과 같은 메소드들을 구현한다.
  ● append()
  오버로드된 이 메소드는 2가지로 구현된다.
   - 첫번째 구현 : Printable/PageFormat T아이 한 페이지를 프린트 하는데 사용될 것을 가정한다.
   - 두번째 구현 : 쌍이 랜더링해야 할 페이지수를 지정한다.
Prinable myPrintable1, myPrintable2, myPrintable3;
pageformat myFormat1, myFormat2, myformat3;
Book myBook = new Book();
myBook.append(myPrintable1, myFormat(1);
myBook.append(myPrintable2, myFormat2.5);
myBook.append(myPrintable3, myFormat(3);
● setpage()
 append()는 Printable/PageFormat 쌍을 Book 리스트의 마지막에 추가하는 반면 이 메소드는 지정된 페이지 위치에 쌍을 저장한다.
  Book myBook = new Book();
  myBook.append(myPrintable1, myFormat1, 5);
  myBook.setPage(2, myPrintable2 myFormat2);
 
 [PrinterJob ]
 ● setPrintable()
 프린트되는 출력 페이지를 랜더링하는 기능을 담당하는 객체를 설정하며, 객체는 Printable 인터페이스를 구현해야 한다.
 ● setPageble()
 여러 페이지들이 프린트 될 때, Printable 과 PageFormat 객체 쌍을 생성하여 Pageable객체에 저장하면 매우 유용하다.
 ● print()
  프린팅 동작을 시작하며, 페이지를 랜더링 하는기능을 담당하는 객체를 설정하는 setPrintable(),. setPageable() 이 호출 된 후에 호출된다.
  프린터 작업이 확인되면 정보는 버퍼에 저장되고 그 버퍼는 프린터가 물리적으로  접속되어 있는 머신의 운영체제나 프린터 자체에서 지원된다.
   - cancel()
     프린터 작업을 취소한다. 랜더링/확인될 때
   - iscanceled()
   현재 프린터 작업을 취소할지를 결정하는 데 사용된다.
   - setJopName(), getJopName()
   프린터 작업의 이름을 수정하거나 봔환할 수 있게 한다.
   - getUserName()
      프린터작업과 관련된 사용자의 이름을 반환한다.
   - setCopies(), getCopies()
      프린트될 출력을 얼마나 많이 복사할 것인지를 나타내는 정수값을 설정하거나 반환한다.
   - defaultPage()
      시스템의 기본 설정을 나타내는 pageFormat을 반환한다.
   - validatePage()
       PageFormat의 인스턴스를 받고 프린터의 한계를 나타내는 객체의 수정된 복사본을 반환한다.
    페이지의 이미지를 생성할 수 있는 영역이 하드웨어 여백이상으로 확장되도록 정의되면 이미지를
    생성할 수 있는 영역 값이 프린터에 의해 지원되는 한계 내에 있도록 수정될 것이다.
Paper paper = new Paper();
paper.setImageableArea(0, 0, 8.5,*72, 11*72);
PageFormat pageformat = new PageFormat();
pageformat.setPaper(paper);
PrinterJob.getPrintJob().validatePage(pageformat);
● pageDialog()
 여백크기와 초기값 같은 PageFormat속성을 사용자가 수정 할 수 있도록 하는 데 사용한다.
 이 메소드가 호출되면 사용자가 값을 에디트 할 수 있게 해 주는 다이얼로그를 출력한다.
 
ImagePrint.java
이미지파일 프린트 예제
import java.awt.*;
import java.awt.print.*;
public class ImagePrint{
 protected Image printImage;
 
 public static void main(String[] args)
 {
  ImagePrint ip = new ImagePrint(args[0]);
  System.exit(0);
 }
 public ImagePrint(String fileName){
  printImage = new javax.swing.ImageIcon(fileName).getImage(); //이미지파일생성
  Paper p = new Paper();
  //출력될 영역 설정
  p.setImageableArea(1*72,  //Left margin 1 inch      //for mm 0.0395
          1.5*72, //Top margin 1.5 inches
          6.5*72, //Width 6.5 inches
          8*72);  //Height 8 inches
  PageFormat format = new PageFormat();
  format.setPaper(p);  //페이지포맷 페이지영역설정을 인자로..
  PrinterJob pj = PrinterJob.getPrinterJob();
  pj.setPrintable(new MyPrintable(), format); 
  try{
   pj.print();
  }catch(PrinterException pe){
   System.out.println("Printingfailed : "+pe.getMessage());
  }
 }
 class MyPrintable implements Printable{
  public int print(Graphics g, PageFormat pf, int pageIndex){
   g.translate((int)(pf.getImageableX()), (int)(pf.getImageableY()));
   
   if(pageIndex == 0){
    g.drawImage(printImage, 0, 0, null);
    return Printable.PAGE_EXISTS;
   }
   return Printable.NO_SUCH_PAGE;
  }
 }
}
 
PrintComponents.java
컴포넌트 프린트 예제
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import javax.swing.*;
public class PrintComponents extends JFrame{
 public static void main(String[] args){
  PrintComponents pc = new PrintComponents();
  pc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  pc.setSize(400, 300);
  pc.setVisible(true);
 }
 public PrintComponents(){
  super("Print Compnents");
  JLabel label;
  JTextField textField;
  Container pane = getContentPane();
  pane.setLayout(new GridBagLayout());
  GridBagConstraints gbc = new GridBagConstraints();
  gbc.anchor = GridBagConstraints.WEST;
  gbc.fill = GridBagConstraints.HORIZONTAL;
  gbc.insets = new Insets(5, 10, 5, 10);
  gbc.gridy = 0;
  label = new JLabel("last Name: " , JLabel.LEFT);
  pane.add(label, gbc);
  textField = new JTextField(8);
  pane.add(textField, gbc);
  label = new JLabel("First Name:", JLabel.LEFT);
  pane.add(label, gbc);
  textField = new JTextField(8);
  pane.add(textField, gbc);
  gbc.gridy++;
  label = new JLabel("Address:", JLabel.LEFT);
  pane.add(label, gbc);
  textField = new JTextField(8);
  gbc.gridwidth = GridBagConstraints.REMAINDER;
  pane.add(textField, gbc);
  gbc.gridy++;
  gbc.gridwidth = 1;
  label = new JLabel("Phone:", JLabel.LEFT);
  pane.add(label, gbc);
  textField = new JTextField(8);
  pane.add(textField, gbc);
  label = new JLabel("Postal Code:", JLabel.LEFT);
  pane.add(label, gbc);
  textField = new JTextField(8);
  pane.add(textField, gbc);
  gbc.gridy++;
  gbc.fill = GridBagConstraints.NONE;
  gbc.anchor = GridBagConstraints.CENTER;
  gbc.gridwidth = GridBagConstraints.REMAINDER;
  JButton btn = new JButton("Print");
  btn.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent event){
    performPrint();
   }
  });
  pane.add(btn, gbc);
 }
 protected void performPrint(){
  PrinterJob job = PrinterJob.getPrinterJob();
  job.setPrintable(new MyPrintable());
  try{
   job.print();
  }catch(PrinterException pe){};
 }
 class MyPrintable implements Printable{
  public int print(Graphics g, PageFormat pf, int index){
   if(index == 0){
    g.translate((int)(pf.getImageableX()), (int)(pf.getImageableY()));
    Container pane = getContentPane();
    pane.paint(g);
    return Printable.PAGE_EXISTS;
   }
   return Printable.NO_SUCH_PAGE;
  }
 }
}

'JAVA/JSP > Source' 카테고리의 다른 글

calendarFunc(mod).js  (0) 2009.12.14
calendarFunc.js  (0) 2009.12.14
간단한 도서관리  (0) 2009.01.29
파일읽기  (0) 2009.01.29
메일(첨부자료 3개) 보내기  (0) 2009.01.29
And