如何从Linux命令行获取字符串的显示宽度?

时间:2014-08-18 15:36:27

标签: bash ubuntu svg awk fonts

我正在开发一个AWK脚本,它逐行处理文本文件,格式化它们并将它们填充到SVG文件文本字段中。 SVG自动处理文本换行,但我想预测每行的换行位置。 (我需要重复一些字符并延伸到接近行的末尾)。我知道文本字段的确切字体,字体大小和宽度。

Linux中是否有标准实用程序或在Ubuntu中可以轻松获得,在给定字符串,字体和字体大小的情况下会给出宽度(以像素或英寸为单位)?

例如:

get-width 'Nimbus Sans L' 18 "test string"
returns "x pixels"

2 个答案:

答案 0 :(得分:3)

你可以使用ghostscript解释器,假设你有这个并且字体设置正确。

这可能是神秘的咒语:

gs -dQUIET -sDEVICE=nullpage 2>/dev/null - \
   <<<'18 /NimbusSanL-Regu   findfont exch scalefont setfont
      (test string)          stringwidth pop =='

使用-dQUIET会抑制有关字体替换的警告,在您对如何命名要查找的字体有所了解之前,这可能不是一个好主意。

ghostscript不是布局引擎,您可能会发现测量不适用于复杂的双向文本,组合字符或东亚语言。 (我用一点阿拉伯语测试它,它没关系,但没有保证。)它没有kern,因此它通常会产生比良好布局引擎稍大的测量值,如果字体位置使用变音符号可能会大很多字距调整。

最后,如果您的文本包含不平衡的括号或反斜杠,则需要将它们转义。我使用以下内容:

"$(sed 's/[()\\]/\\&/g' <<<"$text")"

那是因为Postscript字符串包含在(...) - (test string)中 - 并且允许包括平衡括号。不平衡的括号通常会产生语法错误,除非它们是反斜杠转义的。

答案 1 :(得分:2)

如果您有权访问

FONT="Nimbus Sans L"
SIZE=18
STRING="test string"
inkscape --without-gui --query-id=id1 -W <(echo '<svg><text id="id1" style="font-size:'$SIZE'px;font-family:'$FONT';">'$STRING'</text></svg>') 2>/dev/null

输出(例如):

76.577344