자바로 인쇄하기, 1 부

이전 1 2 페이지 2 페이지 2/2

렌더링 모델

Java에는 Printable작업과 Pageable작업의 두 가지 인쇄 모델이 있습니다 .

인쇄물

Printable작업은 두 가지 인쇄 모델 중 더 간단합니다. 이 모델 PagePainter은 전체 문서에 대해 하나만 사용 합니다. 페이지는 페이지 0부터 시작하여 순서대로 렌더링됩니다. 마지막 페이지가 인쇄되면 값을 PagePainter반환해야합니다 NO_SUCH_PAGE. 인쇄 하위 시스템은 항상 응용 프로그램이 페이지를 순서대로 렌더링하도록 요청합니다. 예를 들어 응용 프로그램이 5-7 페이지를 렌더링하도록 요청하면 인쇄 하위 시스템은 7 페이지까지의 모든 페이지를 요청하지만 5, 6, 7 페이지 만 인쇄합니다. 응용 프로그램에 인쇄 대화 상자가 표시되는 경우이 모델을 사용하는 문서의 페이지 수를 미리 알 수 없기 때문에 인쇄 할 총 페이지 수가 표시되지 않습니다.

페이징 가능

Pageable작업은 Printable작업의 각 페이지 Pageable가 서로 다른 레이아웃을 가질 수 있으므로 작업 보다 더 많은 유연성을 제공 합니다. Pageable작업은 Book다른 형식을 가질 수있는 페이지 모음 인 s 와 함께 가장 자주 사용 됩니다. Book잠시 후에 수업을 설명하겠습니다 .

Pageable작업은 다음과 같은 특징이 있습니다 :

  • 각 페이지에는 자체 페인터가있을 수 있습니다. 예를 들어, 표지를 인쇄하는 화가, 목차를 인쇄하는 다른 화가, 전체 문서를 인쇄하는 세 번째 화가가있을 수 있습니다.
  • 책의 각 페이지에 대해 다른 페이지 형식을 설정할 수 있습니다. A의 Pageable작업, 당신은 세로 및 가로 페이지를 혼합 할 수 있습니다.
  • 인쇄 하위 시스템은 응용 프로그램에 순서대로 페이지를 인쇄하도록 요청할 수 있으며 필요한 경우 일부 페이지를 건너 뛸 수 있습니다. 다시 말하지만, 필요에 따라 문서의 모든 페이지를 제공 할 수있는 한 이에 대해 걱정할 필요가 없습니다.
  • Pageable작업이 문서에 얼마나 많은 페이지를 알 필요가 없습니다.

서적

버전 1.2 이후 새로운 Book클래스가 있습니다. 이 클래스를 사용하면 여러 페이지 문서를 만들 수 있습니다. 각 페이지에는 고유 한 형식과 자체 페인터가있을 수 있으므로 정교한 문서를 유연하게 만들 수 있습니다. 때문에 Book클래스 구현하는 Pageable인터페이스, 당신은 당신의 자신의 구현할 수 Book제공된 경우 클래스를 Book클래스는 당신이 필요로하는 기능이 부족하다.

Book클래스는 페이지의 컬렉션을 나타냅니다. 처음 만들 때 Book개체는 비어 있습니다. 페이지를 추가하려면 두 가지 append()방법 중 하나를 사용 하면됩니다 (자세한 내용은 API 섹션에서이 클래스에 대한 설명 참조). 이 메소드의 매개 변수는 PageFormat페이지의 물리적 특성을 정의하는 PagePainter객체 와 Printable인터페이스 를 구현 하는 객체 입니다. 문서의 페이지 수를 모르는 경우 UNKNOWN_NUMBER_OF_PAGES값을 append()메서드에 전달하면 됩니다. 프린터 시스템은 NO_SUCH_PAGE값을 받을 때까지 책의 모든 페이지 화가를 호출하여 페이지 수를 자동으로 찾습니다 .

API 정의

이론과 실제는이 섹션에서 만날 것입니다. 이전 섹션에서는 페이지 구조, 측정 단위 및 렌더링 모델에 대해 배웠습니다. 이 섹션에서는 Java 인쇄 API를 살펴 보겠습니다.

인쇄에 필요한 모든 클래스 java.awt.print는 3 개의 인터페이스와 4 개의 클래스로 구성된 패키지에 있습니다. 다음 표는 인쇄 패키지의 클래스와 인터페이스를 정의합니다.

이름 유형 기술
Paper 수업 이 클래스는 페이지의 물리적 특성을 정의합니다.
PageFormat 수업 PageFormat페이지의 크기와 방향을 정의합니다. 또한 Paper페이지를 렌더링 할 때 사용할 항목 도 정의 합니다.
PrinterJob 수업

이 클래스는 인쇄 작업을 관리합니다. 그 역할에는 인쇄 작업 생성, 필요할 때 인쇄 대화 상자 표시 및 문서 인쇄가 포함됩니다.

Book 수업

Book문서를 나타냅니다. Book객체는 페이지의 모음 역할을합니다. 에 포함 된 페이지는 Book형식이 같거나 다를 수 있으며 다른 화가를 사용할 수 있습니다.

Pageable 상호 작용 Pageable구현은 페이지 세트를 인쇄 할 나타냅니다. Pageable개체가 아니라 한 세트에 총 페이지 수를 반환 PageFormat하고 Printable지정된 페이지를 참조하십시오. Book클래스는이 인터페이스를 구현합니다.
Printable 상호 작용 페이지 페인터는 Printable인터페이스 를 구현해야합니다 . 이 인터페이스에는 print().
PrinterGraphics 상호 작용 Graphics객체는이 인터페이스를 구현합니다. 인쇄 프로세스를 인스턴스화 한 프린터 작업을 가져 오는 방법을 PrinterGraphics제공합니다 getPrinterJob().

페이징 가능한 인터페이스

Pageable인터페이스는 세 가지 방법을 포함한다 :

방법 이름 기술
int getNumberOfPages() Returns the number of pages in the document.
PageFormat getPageFormat(int pageIndex) Returns the page's PageFormat as specified by pageIndex.
Printable getPrintable(int pageIndex) Returns the Printable instance responsible for rendering the page specified by pageIndex.

Printable interface

The Printable interface features one method and two values:

Name Type Description
int print(Graphics graphics, PageFormat pageFormat, int pageIndex) Method

Requests that the graphics handle using the given page format render the specified page.

NO_SUCH_PAGE Value This is a constant. Return this value to indicate that there are no more pages to print.
PAGE_EXISTS Value The print() method returns PAGE_EXISTS. It indicates that the page passed as a parameter to print() has been rendered and does exists.

Every page painter must implement the Printable interface. Since there is only one method to implement, creating page painters may seem easy. However, remember that your code must be able to render any page in or out of sequence.

There are three parameters to print(), including Graphics, which is the same class used to draw on the screen. Since the Graphics class implements the PrinterGraphic interface, you can obtain the PrinterJob that instantiated this print job. If your page layout is complex and requires some advanced drawing features, you can cast the Graphics parameter to a Graphics2D object. You will then have access to the full Java 2D API.

Before you start using the Graphics object, note that the coordinates are not translated to the top left corner of the printable area. Refer to Figure 3 to find the location of the default origin.

(0, 0) appears at the top left corner of the printer margins. To print a 1-by-1-inch rectangle, 1 inch from both top and left margins, you would use the following code:

1: public int print (Graphics graphics, PageFormat pageFormat, int pageIndex) { 2: Graphics2D graphics2D = (Graphics2D) graphics; 3: Rectangle2D.Double rectangle = new Rectangle2D.Double (); 4: rectangle.setRect (pageFormat.getImageableX () + 72, 5: pageFormat.getImageableY () + 72, 6: 72, 7: 72); 8: graphics2D.draw (rectangle); 9: return (PAGE_EXISTS); }

From the previous example, we see that we must manually translate the origin of the rectangle so that it prints at the top of the printable area as in Figure 1. To simplify the code, we could translate the coordinates once and use (0, 0) as the origin of the printable area. By modifying the previous example, we get:

1: public int print (Graphics graphics, PageFormat pageFormat, int pageIndex) { 2: Graphics2D graphics2D = (Graphics2D) graphics; 3: graphics2D.translate (pageFormat.getImageableX (), pageFormat.getImageableY ()); 4: Rectangle2D.Double rectangle = new Rectangle2D.Double (); 5: rectangle.setRect (72, 72, 72, 72); 6: graphics2D.draw (rectangle); 7: return (PAGE_EXISTS); 8: }

Using the translate() method in line 3, we can translate the coordinates and set our origin (0, 0) at the top of the printable area. From this point on, our code will be simplified.

PrinterGraphics interface

The PrinterGraphics interface consists of one method:

Method name Description
PrinterJob getPrinterJob() Returns the PrinterJob for this rendering request and is implemented by the Graphics class

Paper class

Eight methods make up the Paper class:

Method name Description
double getHeight() This method returns the page's physical height in points (1 inch = 72 points). For example, if you are printing on a letter-size page, the return value will be 792 points, or 11 inches.
double getImageableHeight() This method returns the page's imageable height. The imageable height is the height of the print area that you may draw on. See Figure 1 for a graphical view of the imageable area.
double getImageableWidth() This method returns a page's imageable width (the width of the print area that you may draw on). See Figure 1 for a graphical view of the imageable area.
double getImageableX() This method returns the x origin of the imageable area. Since there is no support for margins, the return value represents the left margin.
double getImageableY() This method returns the y origin of the imageable area. The value returned from this method is equivalent to the top margin.
double getWidth() This method returns the page's physical width in points. If you print on a letter-size paper, the width is 8.5 inches, or 612 points.
void setImageableArea(double x, double y, double width, double height) This method sets the imageable area and specifies the margins on the page. Actually, the API provides no method to set the margins explicitly; you have to calculate them yourself.
void setSize(double width, double height) This method sets the physical page size. To define an 8.5-by-11-inch sheet, you would supply 612 and 792 points. Note that the default size is LETTER.

Before we move on to the next section, remember that the Paper class defines the page's physical characteristics. The PageFormat class represents all the page's characteristics, such as page orientation, size, and the paper type. This class is always passed as a parameter to the Printable interface's print() method. Use Paper to obtain the imageable area location, size, and page orientation along with a transformation matrix.

PageFormat class

The PageFormat consists of 12 methods:

Method name Description
double getHeight() This method returns the page's physical height in points (1 inch = 72 points). If your page measures 8.5 by 11 inches, then the return value will be 792 points, or 11 inches.
double getImageableHeight() This method returns the page's imageable height, which is the height of the print area on which you may draw. See Figure 1 for a graphical view of the imageable area.
double getImageableWidth() This method returns the page's imageable width -- the width of the print area on which you may draw. Figure 1 illustrates a graphical view of the imageable area.
double getImageableX() This method returns the x origin of the imageable area.
double getImageableY() This method returns the imageable area's y origin.
double getWidth() This method returns the page's physical width in points. If you print on letter-sized paper, the width is 8.5 inches, or 612 points.
double getHeight() This method returns the page's physical height in points. For example, letter-sized paper is 11 inches in height, or 792 points.
double[] getMatrix() This method returns a transformation matrix that translates user space into the requested page orientation. The return value is in the format required by the AffineTransform constructor.
int getOrientation() This method returns the orientation of the page as either PORTRAIT or LANDSCAPE.
void setOrientation(int orientation) This method sets the orientation of the page, using the constants PORTRAIT and LANDSCAPE.
Paper getPaper() This method returns the Paper object associated with the page format. Refer to the previous section for a description of the Paper class.
void setPaper(Paper paper) This method sets the Paper object that will be used by the PageFormat class. PageFormat must have access to the physical page characteristics to complete this task.

This concludes the description of the page classes. The next class that we will study is the PrinterJob.

PrinterJob class

The PrinterJob class controls the printing process. It can both instantiate and control a print job. Below you will find a definition of the class:

Method name Description
abstract void cancel() This method cancels the current print job. You can validate the cancellation with the isCancel() method.
abstract boolean isCancelled() This method returns true if the job is cancelled.
PageFormat defaultPage() This method returns the default page format for the PrinterJob.
abstract PageFormat defaultPage(PageFormat page) This method clones the PageFormat passed in parameters and modifies the clone to create the default PageFormat.
abstract int getCopies() This method returns the number of copies that the print job will print.
abstract void setCopies(int copies) This method sets the number of copies that the job will print. Note that if you show a print dialog box, users can alter the number of copies (see the pageDialog method).
abstract String getJobName() This method returns the job name.
static PrinterJob getPrinterJob() This method creates and returns a new PrinterJob.
abstract String getUserName() This method returns the user name associated with the print job.
abstract PageFormat pageDialog(PageFormat page) This method displays a dialog that allows the user to modify the PageFormat. The PageFormat, passed in parameters, sets the fields of the dialog. If the user cancels the dialog, then the original PageFormat will be returned. But if the user accepts the parameters, then a new PageFormat will be created and returned. Since it will not show the same parameters on all operating systems, you must be careful when using the pageDialog.
abstract void setPageable(Pageable document) This method queries the document to obtain the total number of pages. The Pageable will also return the PageFormat and the Printable object for each page. See the definition of the Pageable interface for more information.
abstract void setPrintable(Printable painter) This method sets the Painter object that will render the pages to be printed. A Painter object is an object that implements the Printable class and its print() method.
abstract void setPrintable(Printable painter, PageFormat format) This method completes the same tasks as abstract void setPrintable(Printable painter), except that you supply the PageFormat that the Painter will use. As indicated in the definition of the Printable interface, the print() method passes a PageFormat object as the first parameter.
abstract void print() This method prints the document. It actually calls the print() method of the Painter previously assigned to this print job.
abstract void setJobName(String jobName) This method sets the name of the print job.
abstract boolean printDialog() This method displays a print dialog box that allows the user to change the print parameters. Note that this interaction's result will not be returned to your program. Instead, it will be passed to the peer operating system.
abstract PageFormat validatePage(PageFormat page) This method will validate the PageFormat passed in parameters. If the printer cannot use the PageFormat that you supplied, then a new one that conforms to the printer will be returned.

Book class

Seven methods make up the Book class:

>

Method name Description
void append(Printable painter, PageFormat page) This method appends a page to the Book. The painter and the PageFormat for that page are passed in parameters.
void append(Printable painter, PageFormat page, int numPages) This method completes the same tasks as void append(Printable painter, PageFormat page), except that you specify the number of pages.
int getNumberOfPages() This method returns the number of pages currently in the Book.
PageFormat getPageFormat(int pageIndex) This method returns the PageFormat object for a given page.
Printable getPrintable(int pageIndex) This method returns the painter for a given page.
void setPage(int pageIndex, Printable painter, PageFormat page) This method sets the painter and the PageFormat for a given page already in the book.

The printing recipe

The recipe for printing is very simple. First, create a PrinterJob object:

PrinterJob printJob = PrinterJob.getPrinterJob ();

Next, using the setPrintable() method of the PrinterJob, assign the Painter object to the PrinterJob. Note that a Painter object is one that implements the Printable interface.

printJob.setPrintable (Painter);

Or you could set the PageFormat along with the Painter :

printJob.setPrintable (Painter, pageFormat);

Finally, the Painter object must implement the print() method:

public int print (Graphics g, PageFormat pageFormat, int page)

Here the first parameter is the graphics handle that you will use to render the page, the pageFormat is the format that will be used for the current page, and the last parameter is the page number that must be rendered.

That's all there is to it -- for simple printing, that is.

Introduction to the framework

The print framework that we will build in this series will be completely independent of the Java printing API. It will allow for greater flexibility in producing different outputs. Its structure will allow you to create documents, pages, and print objects. You will be able to add print objects to a page while adding pages to a document. By using this structure, you will be able to easily implement export features to PDF or HTML files, or print directly to the printer using the print API. But the main goal of the framework is to simplify the creation of printed documents. When you print using the print API, you only end up with a graphic canvas to draw on. It fails to address the concepts of paragraphs, images, drawings, graphics, tables, or running headers and footers. Because you must compute the (x, y) origin, the width and height of the printable area, setting margins is a chore. Our print framework will address all of these weaknesses.

Conclusion

We covered a lot of ground in this first part. We looked at measurement units, the structure of page, the two rendering models (Pageable and Printable), and Books, and we concluded with a detailed explanation of the printing API. Next month, we'll focus primarily on code, as we will be putting everything into practice. We will also look at the issues that arise when printing on multiple platforms. Looking ahead to Part 3, I will explain in detail the design and implementation of the framework.

Jean-Pierre Dube는 독립적 인 Java 컨설턴트입니다. 그는 1988 년에 Infocom을 설립했습니다. 그 이후로 Infocom은 제조, 문서 관리 및 대규모 전력선 관리를 포함한 분야에서 맞춤형 애플리케이션을 개발했습니다. Jean-Pierre는 C, Visual Basic 및 Java에 대한 광범위한 프로그래밍 경험을 가지고 있습니다. 후자는 이제 모든 새 프로젝트의 기본 언어입니다. 그는이 기사를 쓰는 동안 돌아가신 어머니에게이 시리즈를 바칩니다.

이 주제에 대해 더 알아보기

  • "Java로 인쇄", Jean-Pierre Dubé ( JavaWorld )
  • 1 부 : 자바 인쇄 모델에 대해 알아보기 (2000 년 10 월 20 일)
  • 2 부 : 첫 페이지 인쇄 및 복잡한 문서 렌더링 (2000 년 12 월 1 일)
  • Part 3 : Jean-Pierre Dubé가 Java Print API 위에서 작동하는 인쇄 프레임 워크를 소개합니다 (2001 년 1 월 5 일).
  • Part 4: Code the print framework
  • (February 2, 2001)
  • Part 5: Discover the print framework's support classes
  • (March 2, 2001)
  • You will find tons of books covering Java AWT, but none will cover this subject to the extent of this book. If you're writing GUIs, you must have this book next to your computer: Graphic Java 2, Mastering The JFCAWT, Volume 1, David M. Geary (Prentice Hall, 1998)

    //www.amazon.com/exec/obidos/ASIN/0130796662/javaworld

  • This book was helpful when Java 1.1 came out, and was the first to talk about printing in Java: Migrating from Java 1.0 to Java 1.1, Daniel I. Joshi and Pavel A. Vorobiev (Ventana Communications Group, 1997)

    //www.amazon.com/exec/obidos/ASIN/1566046866/javaworld

  • 아마도 Java 2D에 대한 최고의 책일 것입니다.이 책은 2D API의 모든 측면을 다루고 Graphics고급 2D 구성을위한 프레임 워크 도 제공합니다 . Java 2D API Graphics, Vincent J. Hardy (Prentice Hall, 1999)

    //www.amazon.com/exec/obidos/ASIN/0130142662/javaworld

  • Java 2D API에 대한 훌륭한 소개 "Getting Started with Java 2D", Bill Day ( JavaWorld , 1998 년 7 월)

    //www.javaworld.com/javaworld/jw-07-1998/jw-07-media.html

이 이야기 "Printing in Java, Part 1"은 원래 JavaWorld에 의해 출판되었습니다.