导出时是否可以在 SVG 中保存任意数据?

Is it possible to save arbitrary data in SVG on export?

我有一个 Illustrator 文件,其中一层和一个画板上有 50 多个组。这些组的布局就像文件中的图块一样。我们的想法是,我们单独导出每个图块并在站点的前端重新组装。为此,我需要能够导出每个“图块”以及一些任意信息。这些 SVG 将被导出以用于网站的前端。

到目前为止,我编写的脚本是:

这让我设置得恰到好处,可以将每个画板导出为单独的 SVG。我把文本放在适当的位置,因为我最初的计划是将它包含在 SVG 中并从前端的 textFrame 中读取它,这样我就可以正确设置图块的位置,然后我会销毁或隐藏 textFrame.

但现在我想知道,是否可以在导出时将这种信息包含在 SVG 中?也许作为 data- 属性?或者别的什么?

更新:

  1. 建议我使用 XML 命名空间而不是数据属性,因为它们更适合 HTML。如何在导出时以编程方式将 XML 节点添加到 SVG?
  2. 我也在研究 variablesdataSets,因为您似乎可以将它们包含在 SVG 导出中。

如果您从 illustrator 导出 svg,它会添加 id=layer_name 作为属性。因此,如果您在每次导出时更改图层名称,则可以使用 id 读取每个 svg。

您可以从单独的 dimensions.json 文件中读取。或者根据id以其他方式嵌入数据。

由于 SVG 是基于 XML,因此您可以扩展它。因此,您需要像这样添加自己的命名空间:

<svg xmlns:myns="someidentifier" ...>.... </svg>

然后你可以像这样添加属性

<path myns:data="...." .../>

甚至像这样的元素:

<myns:data>... </myns:data>

要编辑这些数据,我建议使用 inkscape,它提供了一个 xml 编辑器,您可以使用它为每个元素设置任意属性。

我在这里看过:https://www.adobe.com/devnet/illustrator/scripting.html 和第 61 页(实际版本 JS pdf)有所有 svg 导出选项,但找不到像 "extra data" 这样的东西。但是您可能会对生成的 svg 进行后处理。

更新

回答问题的第 1 部分:

How to save arbitrary data in SVG on export?

您可以编写一个扩展,它自己导出当前文档的 SVG,如 here,第 61/62 页所述。在脚本触发导出后,您可以读取该文件,将其解析为 XML,浏览它,添加其他数据并再次保存,作为新文件或替换现有文件。因此,您可以从脚本中触发它,而不是挂钩导出过程。当然,是否可以创建自己的 SVG 导出文件。

第二部分:

How to add Data to Illustrator elements within the UI?

这更复杂,因此您需要另一个脚本来打开一个对话框,该对话框提供一个输入来为当前选择设置数据。此外,您需要找到一种方法来存储该数据,以便之后可以将其添加到导出的 SVG 中。为此,您可能需要我们做两件事,一个数据的附加文件,以及每个 GraphItem(第 74 页)的 name 属性,以将数据连接到项目。但也有一些陷阱,如:项目可以删除。项目可以转换为其他 SVG 元素,项目名称需要是唯一的,我只是想我可能会成为比较 illustrator 数据和生成的 SVG 的重物。 但是我对 Illustrator 脚本编写的了解并不深入,我可以肯定地说。

旁注

Inkscape 提供了一个基于 SVG 的所有功能来创建和编辑矢量图形的界面,此外它还有一个 XML 编辑器来完全满足您的需求。只需从 Illustrator 转换一次到 Inkscape 即可。由于 Inkscape 使用 SVG 作为格式,它对 SVG 的支持要好得多,而 Illustrators 对 SVG 的支持则相对较差。使用 Inkscape 将确保您在 Graphic 中所做的一切都将作为 SVG 工作,但某些 Illustrator 功能不能,并且必须使用 SVG 渲染为基于像素的图像。