2012-02-27 3 views
5

JavaDocs는 GraphicsEnvironment가 "화면 및 프린터 장치"를 지원함을 나타냅니다.자바 프린터 가져 오기 GraphicsDevice

화면 장치에 대한 정보를 얻는 방법을 볼 수는 있지만 프린터 장치에 대한 정보를 얻는 방법에 대한 정보를 찾을 수없는 것 같습니다.

인쇄 할 때 기본적으로 GraphicsConfiguration 장치를 사용하여 호환 가능한 버퍼링 된 이미지를 만들 수 있어야합니다.

이 작업을 수행하고자하는 주된 이유는 다음과 같습니다

  1. 우리는 페이지의 첫 번째 요청에 대한 페이지 요청 버퍼 단순히 페이지로 (페이지의 후속 요청에 버퍼를 다시 칠하려면 많은 이미지와 복잡한 렌더링이 포함되어 있습니다. 각 페이지 요청에 그림을 그리는 데 시간을 낭비하지 않고 버퍼를 사용합니다.)
  2. 프린터의 고해상도 출력을 유지합니다. 우리는 프린터 Graphics 컨텍스트에 직접 페인트하면 사실상 더 높은 quanity 출력을 얻었고 동일한 크기의 버퍼링 된 이미지를 사용하려고 시도 할 경우이를 수행한다는 것을 알았습니다.

저는 JavaDocs와 Google을 행운없이 검색해 보았습니다.

제안 사항

건배

추가 아이디어 추가 아이디어를 바탕으로

에 따라 업데이트,

GraphicsConfiguration conf = ((Graphics2D) graphics).getDeviceConfiguration(); 
assert conf.getDevice().getType() == GraphicsDevice.TYPE_PRINTER; 
System.out.println("Device: " + conf.getDevice().getIDstring()); 

final AffineTransform trans = conf.getDefaultTransform(); 
double dpi = trans.transform(new Point2D.Float(72, 0), null).getX(); 
System.out.println(dpi + " DPI"); 

Rectangle bounds = conf.getBounds(); 
System.out.println("page size: " + bounds.width + "x" + bounds.height); 
// now you could do 
buffer = conf.createCompatibleImage(bounds.width, bounds.height); 
// verify values, you wouldn’t do this in production code: 

실제로 BufferedImage을 생성 않는 ... 같은 것을 사용하려고 제안되었다 프린터로 변환됩니다.

테스트를하려면 쉽게 보내고, 나는 간단한 print 방법 ...

public void print(Graphics2D g2d, double width, double height) { 
    Font font = g2d.getFont(); 
    font = font.deriveFont(64f); 
    g2d.setFont(font); 
    FontMetrics fm = g2d.getFontMetrics(); 
    String text = "Hello World!"; 
    double x = (width - fm.stringWidth(text))/2; 
    double y = (height - fm.getHeight())/2; 
    g2d.drawString(text, (float) x, (float) y); 
} 

을 쓴 나는 사용자 프린터 Graphics 컨텍스트 또는 다른 Graphics 상황 중 하나를 할 수있다.

분명히 A4 페이지 @ 72dpi로 인쇄 할 때 결과 이미지 크기는 600dpi에서 595x841 (위의 예에서보고 됨)이므로 결과적으로 4970x7029의 이미지가됩니다. 좋아,이

g2d.drawImage(buffer, 0, 0, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableWidth(), null); 

(이 테스트, 그래서 관하여 저에 뛰어하지 않습니다 ... 같은 것을 사용하여 대상 프린터로 Graphics 상황 그릴 때 난 단지 이미지를 축소해야합니다, 괜찮습니다 품질) 아직 관련 문제 ...

그래서하지 않을 왼쪽, 오른쪽 BufferedImage) ... 좋아,에

Printing

가 (정상, 그때 나는 생각 스케일 AffineTransform을 적용 할 수 있습니다. 와 같은 것을 사용하여 버퍼 Graphics 컨텍스트에 ...이 결과

이 나는 ​​우리가 가지고있는 기본 기존의 페인트 루틴 내의 모든 "인쇄 모드"타입 변환을 적용 할 필요가 없습니다 것입니다 의미

double scale = dpi/72d; 
AffineTransform scaleAT = AffineTransform.getScaleInstance(scale, scale); 
g2d.setTransform(scaleAT); 
print(g2d, pageFormat.getImageableWidth(), pageFormat.getImageableWidth()); 

...

Not quite

하지만 잠시만 기다려주세요. 여기에 무슨 문제가 있습니까?

그래서 난 다시 가서 모든 측정을 한 번 봐 ...

GraphicsConfiguration conf = ((Graphics2D) graphics).getDeviceConfiguration(); 
//... 
Rectangle bounds = conf.getBounds(); 
buffer = conf.createCompatibleImage(bounds.width, bounds.height); 

는 4960x7015의 이미지 크기를보고 있었했지만, 그것은 4970x7029 수 ...하지만 무엇을 상상할 수있는 영역에 대해, 기다려야한다 ... 600dpi에서 3768x5827이어야합니다 ... 그래서 신뢰할 수 없습니다. Still misaligned...

+0

이 질문에 대한 사이즈는 Java Graphics2D 또는 HW 프린터로 출력 되었습니까 ??? – mKorbel

+1

@mKorbel도 아닙니다. 화면에 렌더링 할 수있는 호환 가능한 이미지를 만들 수있는 것처럼 프린터에서도 동일한 작업을 수행하려고합니다. 마찬가지로, 버퍼링 된 이미지를 만들고 프린터의 그래픽 컨텍스트에 그리면 72dpi로 렌더링됩니다. 그래프로 직접 그리는 것처럼 프린터의 dpi를 얻는다면 – MadProgrammer

+0

감사합니다. aaaach는 나에게 분명히 다음과 같은 질문을 던져줍니다 :-) – mKorbel

답변

0

Graphics2D

하더라도이를 보정 한 후, 결과는 여전히 이미지 위치도 품질 중 하나에 기대와 안감이없는 ...

이있는 GraphicsConfiguration을 얻을 수있는 방법을 제공 GraphicsDevice에 링크되어 있습니다. 누락 된 정보는 인쇄의 맥락에서 GraphicsGraphics2D이라고 안전하게 가정 할 수있는 정보입니다.

예. 다음 프로그램은 내 설치에서 작동합니다 :

import java.awt.*; 
import java.awt.geom.*; 
import java.awt.image.BufferedImage; 
import java.awt.print.*; 
import javax.print.*; 

public class PrintDev implements Printable { 
    public static void main(String[] args) throws PrintException { 
    final DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; 
    PrintService ps=PrintServiceLookup.lookupDefaultPrintService(); 
    System.out.println(ps.getName()); 
    ps.createPrintJob().print(new SimpleDoc(new PrintDev(), flavor, null), null); 
    } 
    @Override 
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) 
     throws PrinterException { 
    GraphicsConfiguration conf = ((Graphics2D)graphics).getDeviceConfiguration(); 
    assert conf.getDevice().getType()==GraphicsDevice.TYPE_PRINTER; 
    System.out.println("Device: "+conf.getDevice().getIDstring()); 
    final AffineTransform trans = conf.getDefaultTransform(); 
    System.out.println(trans.transform(new Point2D.Float(72,0),null).getX()+" DPI"); 
    Rectangle bounds = conf.getBounds(); 
    System.out.println("page size: "+bounds.width+"x"+bounds.height); 
    // now you could do 
    BufferedImage bi=conf.createCompatibleImage(bounds.width, bounds.height); 
    // verify values, you wouldn’t do this in production code: 
    try { trans.invert(); } 
    catch(NoninvertibleTransformException ex){ return NO_SUCH_PAGE; } 
    Point2D p=trans.transform(new Point2D.Float(bounds.width, bounds.height),null); 
    System.out.printf("page in inches: %.2fx%.2f%n", p.getX()/72, p.getY()/72); 
    return NO_SUCH_PAGE; 
    } 
} 
+0

나는 이것을 시도했지만 작동하지 않았습니다. 나는 다시 시험 할 것이다 – MadProgrammer

+0

실제로, 나는 성공없이 몇 달 전에 비슷한 것을 시도했다. 여전히 – MadProgrammer

+0

을 테스트하고 있습니다. 완전성을 위해 Windows 7 32 비트, jdk 1.7.0_40, ... – Holger

관련 문제