JavaDocs는 GraphicsEnvironment가 "화면 및 프린터 장치"를 지원함을 나타냅니다.자바 프린터 가져 오기 GraphicsDevice
화면 장치에 대한 정보를 얻는 방법을 볼 수는 있지만 프린터 장치에 대한 정보를 얻는 방법에 대한 정보를 찾을 수없는 것 같습니다.
인쇄 할 때 기본적으로 GraphicsConfiguration 장치를 사용하여 호환 가능한 버퍼링 된 이미지를 만들 수 있어야합니다.
이 작업을 수행하고자하는 주된 이유는 다음과 같습니다
- 우리는 페이지의 첫 번째 요청에 대한 페이지 요청 버퍼 단순히 페이지로 (페이지의 후속 요청에 버퍼를 다시 칠하려면 많은 이미지와 복잡한 렌더링이 포함되어 있습니다. 각 페이지 요청에 그림을 그리는 데 시간을 낭비하지 않고 버퍼를 사용합니다.)
- 프린터의 고해상도 출력을 유지합니다. 우리는 프린터 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
) ... 좋아,에
AffineTransform
을 적용 할 수 있습니다. 와 같은 것을 사용하여 버퍼
Graphics
컨텍스트에 ...이 결과
이 나는 우리가 가지고있는 기본 기존의 페인트 루틴 내의 모든 "인쇄 모드"타입 변환을 적용 할 필요가 없습니다 것입니다 의미
double scale = dpi/72d;
AffineTransform scaleAT = AffineTransform.getScaleInstance(scale, scale);
g2d.setTransform(scaleAT);
print(g2d, pageFormat.getImageableWidth(), pageFormat.getImageableWidth());
...
하지만 잠시만 기다려주세요. 여기에 무슨 문제가 있습니까?
그래서 난 다시 가서 모든 측정을 한 번 봐 ...
GraphicsConfiguration conf = ((Graphics2D) graphics).getDeviceConfiguration();
//...
Rectangle bounds = conf.getBounds();
buffer = conf.createCompatibleImage(bounds.width, bounds.height);
는 4960x7015의 이미지 크기를보고 있었했지만, 그것은 4970x7029 수 ...하지만 무엇을 상상할 수있는 영역에 대해, 기다려야한다 ... 600dpi에서 3768x5827이어야합니다 ... 그래서 신뢰할 수 없습니다.
이 질문에 대한 사이즈는 Java Graphics2D 또는 HW 프린터로 출력 되었습니까 ??? – mKorbel
@mKorbel도 아닙니다. 화면에 렌더링 할 수있는 호환 가능한 이미지를 만들 수있는 것처럼 프린터에서도 동일한 작업을 수행하려고합니다. 마찬가지로, 버퍼링 된 이미지를 만들고 프린터의 그래픽 컨텍스트에 그리면 72dpi로 렌더링됩니다. 그래프로 직접 그리는 것처럼 프린터의 dpi를 얻는다면 – MadProgrammer
감사합니다. aaaach는 나에게 분명히 다음과 같은 질문을 던져줍니다 :-) – mKorbel