Java-код для преобразования SVG в PNG с символом UTF-8 - PullRequest
0 голосов
/ 11 января 2019

Я использую приведенный ниже код для создания PNG из файла SVG и записи его в выходной поток сервлета. Файл SVG содержит символы UTF-8 (японский) в имени AXIS.

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 вместо InputStream с «UTF-8», но не работал.

Согласно одному найденному ответу, я попытался написать вместо ServletOutputStream с «UTF-8» в TranscoderOutput, но он не создал никакого изображения.

Спасибо

1 Ответ

0 голосов
/ 11 января 2019

UPDATE

Поскольку он корректно работает на вашем локальном компьютере и в результате вы предоставляете изображение png, оно должно быть независимым от конфигурации кодировки сервера приложений, а сам файл svg правильно закодирован. Я не думаю, что это кодировка вопрос.

@ Eugene K. да, есть вероятность, что некоторые java-классы неявно используют локаль os по умолчанию, но я не могу воспроизвести проблему с тем же кодом, приведенным в вопросе, хотя у меня нет японской локали. ИМХО, очень вероятно, что на сервере установлены недостающие шрифты.

Это может быть не элегантный способ, а также не связанный с Java, но в качестве решения, если у вас есть возможность каким-то образом редактировать исходный файл SVG, который также может быть динамически с некоторыми манипуляциями со строками, если вам когда-либо понадобится, вы можете предоставить шрифт, который включает в себя японские символы и обслуживать его из вашего сервлета. Затем добавьте их в файл 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>

Надеюсь, это поможет!

...