使用Python创建SVG
我正在制作一组SVG文件,但里面有很多硬编码的值(有些元素必须以毫米为单位打印,而其他元素则需要按百分比缩放,而且大多数值都是相对定义的)。为了避免手动管理这些数字(天哪,如果我想改动什么该多麻烦),我想用我熟悉的Python来处理这个问题。
SVG 1.1本身不支持任何可以让我实现我想要的变量方案,而且我也不想在这个过程中引入JavaScript或不稳定的W3C草案规范。一个明显的解决办法是使用字符串格式化来读取、解析和替换SVG文件中的变量。虽然对于较大的文档来说,这似乎不是个好主意,但它的优点是简单且易于移植。
我第二个想法是研究一下可用的Python到SVG的库。不幸的是,似乎可选的库要么太新(比如pySVG的接口还不稳定),要么太旧(自2005年以来没有更新),或者已经被放弃。我没有仔细研究,但我感觉这些图表应用程序的灵活性不足,无法生成我需要的文档。
我发现的第三个选项是使用其他绘图工具(比如cairo),它可以输出SVG。这可能有一个(潜在的)缺点,就是不支持我非常看重的绝对元素大小,但可能可以输出PDF,这样会比较方便。
我已经做过一些搜索,所以我希望能听听那些使用过上述方法的人,或者知道其他解决方案的人给出的建议。选择的解决方案的长期稳定性对我来说很重要(这也是我选择手动编码而不是直接使用Illustrator的原因)。
目前,我倾向于第一个解决方案,所以如果有人能推荐一些使用Python解析和替换XML文件中变量的最佳实践,我会非常欢迎。
2 个回答
因为SVG是一种XML格式的文件,所以你可以考虑使用XSLT来把一个包含你变量的源XML文件转换成SVG。在你的XSLT样式表中,你会有一些模板,这些模板对应着你SVG插图中的不同元素,它们会根据源XML文件中的值来改变输出的内容。
另外,你也可以使用一个模板SVG作为源文件,然后把它转换成最终的SVG,转换时把值作为参数传递给XSLT处理器。
你可以直接使用XSLT,或者如果你需要一些在传统编程语言中更容易实现的逻辑,也可以通过Python来使用它。
一种基于标记的模板引擎,比如genshi,可能会很有用。它可以让你大部分的创作工作使用SVG工具来完成,然后在模板中进行个性化调整。我肯定更喜欢这个,而不是XSLT。