Java 将 SVG 转换为具有 UTF-8 字符的 PNG 的代码

Java code to convert SVG to PNG with UTF-8 character

我正在使用以下代码从 SVG 文件创建 PNG 并将其写入 Servlet 输出流。 SVG 文件在 AXIS 名称中包含 UTF-8(日语)字符。

ServletOutputStream out = response.getOutputStream();
InputStream svgFileStream = new FileInputStream(svgFile);
TranscoderInput inputSvgImage = new TranscoderInput(svgFileStream);
PNGTranscoder converter = new PNGTranscoder();
TranscoderOutput outputPngImage = new TranscoderOutput(out);
converter.transcode(inputSvgImage, outputPngImage);

上面的代码在我的本地运行良好,但是当我将它上传到服务器时,它显示的是方块而不是字符。当有英文字符而不是日文字符时,它在本地和服务器上都可以正常工作。

如果您遇到同样的问题,能否告诉我。 它可以与 Tomcat 相关吗?

我检查了来自服务器的 SVG 文件,其中可以看到 UTF-8 字符。 我还尝试使用 "UTF-8" InputStreamReader 而不是 InputStream 但没有用。

根据发现的一个响应,我尝试在 TranscoderOutput 中使用 "UTF-8" Write 而不是 ServletOutputStream,但它没有创建任何图像。

谢谢

更新

只要它在你的本地工作正常并且你因此提供了一个 png 图像,它必须独立于应用程序服务器的编码配置,并且你的 svg 文件本身编码正确我不认为它是编码问题。

@Eugene K. 是的,有些 java 类 隐含地使用 os 默认语言环境,但我无法重现问题尽管我没有日语语言环境,但给出了相同的代码。 恕我直言,服务器很可能安装了一些丢失的字体。

这可能不是一种优雅的方式,也与 Java 无关,但作为一种解决方案,如果你有机会以某种方式编辑你的源 svg 文件,它也可以动态地进行一些字符串操作,如果如果您需要,您可以提供一种包含日文字符的字体并从您的 servlet 提供它。然后将这些添加到您的 svg 文件并为您的文本指定字体系列:

<defs>
  <style type="text/css">
  <![CDATA[
  @font-face {
    font-family: Somefont;
    src: url('http://localhost:8080/Somefont.ttf');
  }
  ]]>
  </style>
</defs>
<text font-family="Somefont" font-size="40" fill="blue">Text for test!</text>

希望对您有所帮助!