我遇到了使用Apache Batik转换PNG的问题,当有一个带有不同字体系列的文本时会有所不同,例如Arial。问题出现在Cent OS 6运行Tomcat 7和Java 6的环境中。
用于将SVG转换为PNG的Java代码是:
// Convert the SVG image to png and send back
PNGTranscoder transcoder = new PNGTranscoder();
//
TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(svgImage));
outStream = new ByteArrayOutputStream();
TranscoderOutput output = new TranscoderOutput(outStream);
// Transcode the given SVG
transcoder.transcode(input, output);
outStream.flush();
pngImage = outStream.toByteArray();
我要转换为PNG的SVG文件是:
<svg version="1.1" x="0" y="0" id="hjtqebzv1" width="610" height="240" xmlns="http://www.w3.org/2000/svg" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="LFFFFFF0" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:0.8"/>
<stop offset="100%" style="stop-color:#FAFAFA;stop-opacity:1"/>
</linearGradient>
</defs>
<g id="hjtqebzv-o1" transform="translate(5,5)">
<rect x="1" y="1" width="578" height="20" fill="url(#LFFFFFF0)" stroke="#5e5ca7" stroke-width="2" stroke-linejoin="round" stroke-linecap="round"/>
<text x="1" y="1" width="578" height="19" >
<tspan x="2" y="14" style="font-family:Arial;font-size:12px;fill:#000000;">This is a test text for testing text overlapping in the rectangle when convert the svg to PNG using SVG-Batik</tspan>
</text>
</g>
</svg>
当我在Firefox浏览器中打开SVG文件时,它会正确显示,如下图所示:
但是当我使用Apache Batik转换SVG时,转换的图像看起来不同。 Apache Batik转换PNG是:
在运行tomcat 7和Java 7的Windows 7中,生成的图像与原始SVG相同。
作为Cent OS服务器,它提供了文本消息图像,我觉得Tomi / java应用程序无法使用Arial字体,需要手动加载它。如果是这样,我更倾向于建议从底层操作系统位置(操作系统字体位置)以通用方式加载它们,而不对SVG文件进行任何更改。
答案 0 :(得分:4)
您需要安装Microsoft truetype字体,并通过设置JAVA_FONTS
环境变量使其可用于Java虚拟机。
wget http://www.my-guides.net/en/images/stories/fedora12/msttcore-fonts-2.0-3.noarch.rpm
rpm -ivh msttcore-fonts-2.0-3.noarch.rpm
打开/etc/bashrc
并将以下内容添加到文件末尾
JAVA_FONTS=/usr/share/fonts/msttcore
export JAVA_FONTS