【问题标题】:Java code to convert SVG to PNG with UTF-8 character使用 UTF-8 字符将 SVG 转换为 PNG 的 Java 代码
【发布时间】:2019-06-06 16:21:48
【问题描述】:

我正在使用以下代码从 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 字符。 我还尝试了 InputStreamReader 而不是带有“UTF-8”的 InputStream,但没有奏效。

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

谢谢

【问题讨论】:

  • 如果您可以控制正在运行的 Tomcat 服务器,您可以尝试指定以下 JVM 选项:-Dfile.encoding=UTF-8
  • 某些 Java 类默认使用基于区域设置和系统配置的系统范围(“平台”)“默认”字符集。这就是为什么您的代码在不同环境中的表现可能不同的原因。

标签: java tomcat svg png batik


【解决方案1】:

更新

只要它在您的本地工作正常并且您因此提供 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>

希望对你有帮助!

【讨论】:

  • 谢谢它的工作......但在蜡染库中它没有在 PNG 文件中显示 X 和 Y 轴的硬线。有没有办法显示它?
  • 不客气,我很高兴它对你有用 :) 实际上我对蜡染库并不熟悉。我认为您使用蜡染生成或操作 svg 以创建图形或图表,对吗?如果是这样,如果您能提供更多关于 X 和 Y 轴的硬线的详细信息,我会尽力提供帮助。另外,如果您有机会分享 svg 文件的内容,那就更好了
  • 嗨,我创建了另一个帖子stackoverflow.com/questions/54265111/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2016-04-03
  • 2011-06-25
相关资源
最近更新 更多