gpt4 book ai didi

java - 如何获得在 300 dpi 标签打印机上打印的文本的高度和宽度?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:34 25 4
gpt4 key购买 nike

我需要打印一段文字,例如“产品名称”到标签,由 JAVA 的 300 dpi 标签打印机打印。字体是宋体。字体大小 6。如何计算文本的宽度(以毫米为单位)?

String fontName = "Arial";
int fontSize = 6;
String string = "Product name";
Font font = new Font(fontName, Font.PLAIN, fontSize);
Canvas c = new Canvas();
FontMetrics fm = c.getFontMetrics(font);
int i = fm.stringWidth(string);

在上面的代码中,i=36。但是“36”是什么意思呢?使用 300DPI 打印机在标签上打印时,如何获得以毫米为单位的宽度?

最佳答案

您问题中的代码正在调用 new Canvas(),它将假设您的屏幕是预期的输出设备,从而在不同系统上产生不同行为的可能性。

This doc明确表示 Java 2D 中的用户空间旨在为每英寸 72 个单位。 FontMetrics 的 Javadoc 没有明确说明它返回的单位,但它是用户空间坐标是有意义的。这意味着您看到的 36 是 36/72 英寸,即 12.7 毫米。

更新 2:

您的问题没有说明如何将呈现的文本发送到打印机,因此您可能已经有一个 Graphics 或 Graphics2D 对象,可以从中获取实际输出设备上下文中的字体规范。如果你不这样做,下面的代码应该创建一个独立于屏幕的图形上下文:

    BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
FontMetrics fm = g.getFontMetrics(new Font("Arial", Font.PLAIN, 6));
int width = fm.stringWidth("Product name");

结果还是36,单位是1/72英寸。

更新 3:

在下图中,字符串“NCW”以 Java 呈现的 Arial 格式显示。矩形的底部是基线,矩形的左下角是我告诉 Java 绘制字符串的点。矩形的宽度是 fm.stringWidth() 的输出,如上。 (矩形的顶部是任意的。)您可以看到字符串宽度与文本接触基线的点无关,但也不是从最左侧到最右侧填充像素的距离。相反,它是沿着基线向右前进,从绘制此字符串的位置到通常绘制下一个字符串的位置。

Image produced by short Java program to demonstrate stringWidth

C 和 W 之间的间距是字距调整的一个很好的例子。字体设计师还选择让 C 的底边稍微延伸到基线以下,因为除非你作弊,否则圆形在视觉上看起来不会与直线对齐。请注意 N 的左侧有一些空间而 W 的右侧有更少的空间。这与 C 和 W 之间的空间更小的原因相同:使其看起来正确。如果字体设计师愿意,他可以让 W 延伸到方框之外,就像 C 延伸到方框下方一样。

最终结果是字母形式的视觉重量应该均匀分布,所以那个框的中心应该是文本的视觉中心。所以你应该能够忽略我刚才说的一切,将字符串宽度的一半添加到起点,称之为中心,然后开心。

如果结果看起来不居中,那么要么是您的数学计算有误,要么是打印代码中的某些内容没有按照您认为的那样进行,或者字体设计者根本没有平衡视觉重量随你喜欢。如果是后者,请随意应用一些艺术许可并将其捏造到你喜欢的地方。

关于java - 如何获得在 300 dpi 标签打印机上打印的文本的高度和宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19541660/

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