SVG是一种XML格式,因此您可以使用像这样的XML转换来修复它:
shell> xsltproc svglinewidth.xsl convertedImage.svg > fixedImage.svg
其中svglinewidth.xsl包含以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:param name="stroke-width">1px</xsl:param>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*|text()|*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@style[contains(., 'stroke-width:')]">
<xsl:variable name="before" select="substring-before(.,'stroke-width:')"/>
<xsl:variable name="rest" select="substring-after(.,'stroke-width:')"/>
<xsl:variable name="after" select="substring-after($rest,';')"/>
<xsl:attribute name="style">
<xsl:value-of select="$before"/>
<xsl:text>stroke-width:</xsl:text>
<xsl:value-of select="$stroke-width"/>
<xsl:text>;</xsl:text>
<xsl:value-of select="$after"/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@*|text()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
这将替换style属性中stroke-width的所有出现为stroke-width:1px的值,
要指定另一个宽度,您可以像这样向xsltproc传递参数:
shell> xsltproc --stringparam stroke-width 5px svglinewidth.xsl convertedImage.svg > fixedImage.svg
几乎任何平台都可以使用xsltproc。Linux有它作为软件包,对于Unix,请参见
http://xmlsoft.org/XSLT/xsltproc2.html
希望这能帮到你。
更新:
如果您不想设置固定的描边宽度,而是想添加一些内容到描边宽度中,则以下更改将完成任务:
- 从xsl:param值中删除单位(px),使其变为
<xsl:param name="stroke-width">1</xsl:param>
- 在现有变量后添加一个新变量:
<xsl:variable name="current" select="substring-before($rest,';')"/>
- 用
$current + $stroke-width
替换xsl:value-of
标记的select
属性,使其看起来像这样:<xsl:value-of select="$current + $stroke-width"/>
这假设源SVG中stroke-width:
后面没有单位。为了进行加法运算,旧值和增量都必须是纯数字。
svg * { stroke-width: 1px }
不是也可以吗?如果它在嵌入式图像中无效,将其嵌入SVG中一定有效。 - Dagg Nabbitsvg * {stroke-width: 1px !important}
可能会起作用。但我认为还有更好的解决方案。 - Thomas Wpdf2svg
。如果这没有帮助,我建议进行第二步SVG清理,这是一个好主意,因为Inkscape可以产生一些非常膨胀的SVG标记。根据这是否是一次性任务或您经常进行此转换,手动或自动清理都是可取的。为了更好地帮助您清理,我会要求至少提供转换后的SVG片段。 - Thomas W