如何将文本转换为 SVG 路径?
我在 ttf 文件中有一个字体,想要生成 SVG,并将文本转换为路径。我不需要图像(因此使用 imagettftext 或 Image Magick 字体渲染功能是不够的),我需要可以放大和缩小的形状,我想丢失有关所使用字体的信息,并且不想在中引用它SVG 文件(因此此处不能使用字体声明)。是否可以?
I have a font in ttf file and want to generate SVG with text turned into paths. I don't need image (so using imagettftext or Image Magick font rendering capabilities is not enough), I need shape, that can be scaled up and down and I want to lose information about font used and don't want to reference it in SVG file (so font-face declarations can't be used here). Is it possible?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
运行 Inkscape。输入您的文字。单击菜单>路径>对象到路径。
单击另存为...并选择纯 SVG 格式。
Run Inkscape. Enter your text. Click Menu > Path > Object to Path.
Click Save As... and choose the plain SVG format.
在四四方方的 SVG 3.28 中
选择文本然后进入菜单:形状> 为路径形状
文本将转换
,每个字形现在都是给定字体/字体的可编辑矢量形状David Spector 的 Inkscape 答案是我最近使用的答案
in Boxy SVG 3.28
Select text then go into menu: Shape > Shape to Path
the text will convert and each glyph is now an editable vector shape from the given typeface/font
David Spector's Inkscape answer is the one I use more recently
如果您可以获得 svgfont,那么您就拥有了使用字形路径渲染它的所有信息(将所需的所有字形路径数据复制粘贴到任意数量的路径元素,然后应用翻转 y 变换并将其缩放到任何大小)您需要的尺寸)。 Batik 有一个名为 ttf2svg 的工具,它可以为您提供 svgfont 输出。还有其他的,例如 fontforge。
不确定是否有任何纯命令行工具可以直接生成这样的 svg,但 Inkscape 解决方案应该完全符合您的要求。
If you can get an svgfont out then you have all the information there to render it using the glyph paths (copy-paste all the glyph path data you need to any number of path elements and apply a flip-y transform and scale it to whatever size you need). Batik has a tool called ttf2svg, which gives you svgfont output. There are others as well, fontforge for example.
Not sure if there are any pure command-line tools out there that can generate an svg like this directly, but the Inkscape solution should do exactly what you want.
Javascript 和 php 方法
如果您为用户使用基于 Web 的 GUI,您也可以选择 JS/php 混合方法:
客户端/JS 部分
默认 opentype 来完成的。 js支持
.woff
、.ttf
、otf
。woff2
需要 wawoff2 库来进行 brotli 解压缩。opentype.js 中创建 SVG 路径数据的核心函数是
font.getPath()
通过php保存到服务器
显然,我们不能只用JS将静态文件保存到服务器。由于 SVG 是基于 XML 文本的,我们可以将 JS 生成的 SVG 发送到接收 SVG 标记的相当简单的 php 脚本。确保包含更多安全措施以避免各种上传!
php/save_json.php
JS 获取函数
在上面的代码片段中,我们将输出渲染到 SVG 元素。
这样我们就可以调整
viewBox
以满足文本的实际边界。在将标记发送到 php 脚本之前,我们需要使用XMLSerializer().serializeToString(svg)
序列化/字符串化修改后的 SVG。保存到服务器功能看起来像这样:
JS 保存按钮
Javascript and php approach
In case you're using a web based GUI for users you may also opt for a JS/php hybrid approach:
Client-side/JS part
By default opentype.js supports
.woff
,.ttf
,otf
.woff2
requires the wawoff2 library for brotli decompression.The core function to create SVG path data in opentype.js is
font.getPath()
Save to server via php
Obviously, we can't save static files to a server with JS only. Since SVG is XML text based we can send the JS generated SVG to a rather simple php script receiving the SVG markup. Make sure to include more security measures to avoid all kinds of uploads!
php/save_json.php
JS fetch function
In the above snippet we were rendering the output to a SVG element.
This way we can adjust the
viewBox
to meet the actual boundaries of the text. Before sending the markup to the php script we need to serialize/stringify the modified SVG withXMLSerializer().serializeToString(svg)
.The save-to-server function would look something like this:
JS save button
我创建了自己的类来处理 SVG 字体文件并将文本转换为字形。使用示例:
结果示例:
我的班级代码:
I have created my own class to process SVG font file and to turn text into glyphs. Example of using:
Example result:
Code for my class:
解决方法是使用 inkscape(在将 SVG 文档保存到
file.txt 后通过
)。在 inkscape 0.49+ 中,您可以只需传递exec
执行它)。 svg--export-to-svg
和--export-text-to-path
,如下所示:在 inkscape
中0.49,您可以手动编写 inkscape 脚本(请注意,这需要 X 服务器):
A workaround is using inkscape (execute it via
exec
or so after saving the SVG document tofile.svg
). In inkscape 0.49+, you can simply pass--export-to-svg
and--export-text-to-path
, like this:In inkscape < 0.49, you can manually script inkscape (note that this requires an X server):
我刚刚根据你的库编写了一个 PHP 库,它可以操作字体数据(来自 SVG 文件)并对其进行任何类型的转换。您可以从 GitHub 尝试一下:
https://github.com/kartsims/easysvg
使用示例:
SVG 数据操作示例:
I just wrote a PHP library based on yours that manipulates font data (from SVG file) and does any sort of transformation on it. You may give it a try from the GitHub :
https://github.com/kartsims/easysvg
Usage example :
SVG data manipulation example :