среда, 29 февраля 2012 г.

PDF из карты GeoServer с русским текстом через Mapfish print create.json

Раньше я публиковал PDF из карты GeoServer с русским текстом, как сделать русский текст в PDF через print.pdf. А теперь потребовалось сделать тоже самое через create.json. Причём HTTP POST запрос формируется на сервере приложения, и всё описанное уже не работает! Теперь нужно всё делать заново. У нас разрабатывается приложение, которое на стороне клиента создаёт бин printBean. Выглядит это так:
Все данные поступают на сервер. Там формируется POST запрос к геосерверу через create.json. Все строки передаются в UTF-8. Но модуль печати по-умолчанию применяет ANSI с кодировкой Cp1252! В предыдущем посте описано, что мы используем на геосервере TTF с кириллицей. Так что можно обмануть плагин, чтобы не лезть в его исходники и ничего не менять.
Перед передачей json на геосервер я применил для параметров, содержащих русский текст, следующую функцию
    private static String encodeToAnsi(String source) {
        return new String(source.getBytes(Charset.forName("cp1251")), Charset.forName("cp1252"));
    }
Всё просто. При формировании json вызывается эта функция в нужных местах:
JSONObject spec = new JSONObject();
spec.put("header", encodeToAnsi(printBean.getHeader()));
spec.put("footer", encodeToAnsi(printBean.getFooter()));
И вот вам результат:
Текст отображается кириллицей! Несмотря на то, что послан был в кодировке Cp1252:
{"footer": "Íèæíèé",
 "layout": "A4 portrait",
 "pages": [{"bbox": [3815,6450,7278,8756]}],
 "layers": [{
  "layers": ["egko","troad_direction"],
  "opacity": 1,
  "baseURL": "http://localhost:8080/geoserver/wms",
  "styles": ["",""],
  "singleTile": true,
  "format": "image/png",
  "type": "WMS"
 }],
 "srs": "EPSG:60000",
 "dpi": 100,
 "header": "Âåðõíèé",
 "units": "m"
}