- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要打印一段文字,例如“产品名称”到标签,由 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()
的输出,如上。 (矩形的顶部是任意的。)您可以看到字符串宽度与文本接触基线的点无关,但也不是从最左侧到最右侧填充像素的距离。相反,它是沿着基线向右前进,从绘制此字符串的位置到通常绘制下一个字符串的位置。
C 和 W 之间的间距是字距调整的一个很好的例子。字体设计师还选择让 C 的底边稍微延伸到基线以下,因为除非你作弊,否则圆形在视觉上看起来不会与直线对齐。请注意 N 的左侧有一些空间而 W 的右侧有更少的空间。这与 C 和 W 之间的空间更小的原因相同:使其看起来正确。如果字体设计师愿意,他可以让 W 延伸到方框之外,就像 C 延伸到方框下方一样。
最终结果是字母形式的视觉重量应该均匀分布,所以那个框的中心应该是文本的视觉中心。所以你应该能够忽略我刚才说的一切,将字符串宽度的一半添加到起点,称之为中心,然后开心。
如果结果看起来不居中,那么要么是您的数学计算有误,要么是打印代码中的某些内容没有按照您认为的那样进行,或者字体设计者根本没有平衡视觉重量随你喜欢。如果是后者,请随意应用一些艺术许可并将其捏造到你喜欢的地方。
关于java - 如何获得在 300 dpi 标签打印机上打印的文本的高度和宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19541660/
表架构 DROP TABLE bla; CREATE TABLE bla (id INTEGER, city INTEGER, year_ INTEGER, month_ INTEGER, val I
我需要拆分字符串/或从具有以下结构的字符串中获取更容易的子字符串。 字符串将来自 window.location.pathname 或 window.location.href,看起来像 text/n
每当将对象添加到数组中时,我都会尝试更新 TextView ,并在 TextView 中显示该文本,如下所示: "object 1" "object 2" 问题是,每次将新对象添加到数组时,它都会覆盖
我目前正在寻找使用 Java 读取网站可见文本并将其存储为纯文本字符串的方法。 换句话说,我想转换成这样: Hello stupid World进入“ Hello World ” 或者类似的东西 Un
我正在尝试以文本和 HTML 格式发送电子邮件,但无法正确发送正确的 header 。特别是,我想设置 Content-Type header ,但我找不到如何为 html 和文本部分单独设置它。 这
我尝试了上面的代码,但我无法绑定(bind)文本,我怎样才能将资源内部文本 bloc
我刚刚完成了 Space Shooter 教程,由于没有 GUIText 对象,所以我创建了 UI.Text 对象并进行了相应的编码。它在统一播放器中有效,但在构建 Web 应用程序后无效。我花了一段
我有这个代码: - (IBAction)setButtonPressed:(id)sender { NSUserDefaults *sharedDefaults = [[NSUserDefau
抱歉标题含糊不清,但我想不出我想在标题中做什么。无论如何,对于图像上的文本,我使用了 JLabel 文本并将其添加到图标中。 JLabel icon = new JLabel(new Imag
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我在将 Twitter 嵌入到我从 HTML 5 转换的 wordpress 运行网站时遇到问题。 我遇到的问题是推文不是我的自定义字体... 这是我无法使用任何 css 定位的 HTML 代码,我正
我正在尝试找到解决由于使用以下形式的代码而导致的冗余字符串连接问题的最佳方法: logger.debug("Entering loop, arg is: " + arg) // @1 在大多数情况下,
我写了这个测试 @Test public void removeRequestTextFromRouteError() throws Exception { String input = "F
我目前正在创建一个正则表达式来拆分所有匹配以下格式的字符串:&[文本],并且需要获取文本。字符串可能类似于:something &[text] &[text] everything &[text] 等
有没有办法将标题文本从一个词变形为另一个词,同时保留两个词中使用的字母?我看过的许多 css 文本动画大多是视觉的,很少有旋转整个单词的。 我想要做的是从一个词过渡,例如“BEACH”到“CHANGE
总结matplotlib绘图如何设置坐标轴刻度大小和刻度。 上代码: ?
我在容器 (1) 中创建了容器 (2)。你能帮忙如何向容器(1)添加文本吗?下面是我的代码 return Scaffold( body: Padding( padding: c
我似乎找不到任何人或任何人这样做过。我试图限制我们使用的图像数量,并想创建一个带有渐变作为其“颜色”的文本,并在其周围设置渐变轮廓/描边 到目前为止,我还没有看到任何将两者结合在一起的东西。 我可以自
我正在为视频游戏暗黑破坏神 2 使用 discord.py 构建一个不和谐机器人。其中一项功能要求机器人从暗黑破坏神 2 屏幕截图中提取项目的名称和属性。我目前正在为此使用 pytesseract,但
我很难弄清楚如何旋转 strip.text theme 中的属性来自 ggplot2 .我使用的是 R 版本 3.4.2 和 ggplot2 版本 2.2.1。 以下是 MWE 的数据。 > dput
我是一名优秀的程序员,十分优秀!