我正在编写一个使用svg在图像上绘制点的应用程序。该图像最初以pdf形式出现,我使用命令中的Inkscape将其转换为.svg文件:
inkscape –l convertedImage.svg baseImage.pdf
然后在我的html中使用我的svg标签中的转换图像。
<svg>
<image x=”100” y=”100” width=”500” height=”500”
xlink:href=”/my/location/convertedImage.svg”></image>
…
</sig>
我的问题是转换后图像线太亮了。如果我打开Inkscape GUI,我可以选择图像,然后在“笔触样式”选项卡中将宽度增加1px。这样做会让图像看起来像我一样,但我需要能够以编程方式完成它,因为我每天都在运行这个命令,通过许多pdf文件。
有没有办法可以:
答案 0 :(得分:5)
SVG是一种XML格式,因此您可以使用这样的XML转换来修复它:
壳&GT; xsltproc svglinewidth.xsl convertedImage.svg&gt; 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>
这将使用值stroke-width替换样式属性中出现的所有stroke-width:1px,
要指定另一个宽度,可以将参数传递给xsltproc,如下所示:
壳&GT; xsltproc - stringparam stroke-width 5px svglinewidth.xsl convertedImage.svg&gt; fixedImage.svg
xsltproc几乎适用于任何平台。 Linux将其作为包,对于Unix,请参阅http://xmlsoft.org/XSLT/xsltproc2.html
希望有所帮助。
<强>更新强> 如果您不想设置固定的笔触宽度,但将添加到笔划宽度,则以下更改将完成此任务:
<xsl:param name="stroke-width">1</xsl:param>
<xsl:variable name="current" select="substring-before($rest,';')"/>
select
标记的xsl:value-of
属性替换为$current + $stroke-width
,如下所示:<xsl:value-of select="$current + $stroke-width"/>
这假设源SVG中stroke-width:
之后没有单元。要添加,旧值和增量都必须是普通数字。