gpt4 book ai didi

java - 获取 Java 打印机图形设备

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:04 25 4
gpt4 key购买 nike

JavaDocs 表明 GraphicsEnvironment 支持“屏幕和打印机设备”。

我可以看到如何获取有关屏幕设备的信息,但我似乎无法找到有关如何获取有关打印机设备的信息的信息。

基本上,在打印时,我希望能够使用设备 GraphicsConfiguration 创建兼容的缓冲图像。

想要这样做的主要原因是:

  1. 我们希望在页面的第一个请求时缓冲页面请求,并在页面的后续请求中简单地绘制缓冲区(因为页面包含许多图像和一些复杂的渲染 - 而不是浪费时间绘制每个页面请求,我们想使用缓冲区)
  2. 保持打印机的高分辨率输出。我们发现,如果我们直接在打印机图形上下文中绘制,我们将获得比我们尝试使用相同大小的缓冲图像时更高质量的输出。

我试过搜索 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,它将被转换为打印机 DPI

为了方便测试,我写了一个简单的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 上下文。

现在很明显,当以 72dpi 打印到 A4 页面时,生成的图像尺寸为 595x841,在 600dpi 下(上面的示例报告了这一点),这会产生 4970x7029 的图像。好的,这很好,我只需要在绘制到目标打印机 Graphics 上下文时使用类似...

的方法缩小图像
g2d.drawImage(buffer, 0, 0, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableWidth(), null);

(这是测试,所以不要就质量相关问题来指责我)...

Printing

(左边是Normal,右边是BufferedImage)...好吧,那不行

然后我想,我可以将 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...

最佳答案

Graphics2D 提供了一种获取链接到 GraphicsDeviceGraphicsConfiguration 的方法。缺少的是信息,当您可以安全地假设 Graphics 是打印上下文中的 Graphics2D 时。

例如以下程序适用于我的设置:

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;
}
}

关于java - 获取 Java 打印机图形设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9473104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com