Диаграммы IText, batik и vaadin неправильно масштабируются в Linux

У меня возникли проблемы с выводом диаграмм в PDF. Недавно я опубликовал это: Создание PDF с iText и батик, которое было решено, как было предложено с некоторой доработкой весов.

Я запускаю amy testenviroment на локальном сервере Glassfish на компьютере с Windows 10, и когда я экспортирую в PDF, я действительно получаю теперь довольно хороший результат.

Результат Windows

Но когда я отправил результаты на сервер RHEL, результаты отличались. Диаграммы, представленные на веб-сайте, великолепны, но когда я экспортирую их в pdf, я получаю следующее:

Результат Linux

Как видите, заголовок сдвинут вниз, ось Y с метками почему-то обрезана, а метки данных сплющены. Я пробовал играть с разными масштабами, с масштабированием и без него, с масштабированием до абсолютного значения и так далее, но что бы я ни делал, оно продолжает делать эти странные вещи.

Кто-нибудь знает, что происходит, а еще лучше, как это исправить? Я дважды проверил, что phantomjs — это та же версия, чтобы убедиться, что SVG правильный.

Код выглядит следующим образом:

private Image createSvgImage(PdfContentByte contentByte, Chart chart) throws IOException {
    Configuration configuration = chart.getConfiguration();
    configuration.setExporting(false);
    SVGGenerator generator = SVGGenerator.getInstance();
    generator.withHeigth(600);
    generator.withWidth(1200);
    String svg = generator.generate(configuration);
    Image image = drawUnscaledSvg(contentByte, svg);
    image.scaleToFit(800, 370);
    configuration.setExporting(true);
    return image;
}


    private Image drawUnscaledSvg(PdfContentByte contentByte, String svgStr) throws IOException {
    GraphicsNode imageGraphics = buildBatikGraphicsNode(svgStr);

    float width = 1200;
    float height = 600;
    PdfTemplate template = contentByte.createTemplate(width, height);
    Graphics2D graphics = template.createGraphics(width, height);
    try {

        imageGraphics.paint(graphics);
        graphics.translate(-10, -10);

        return new ImgTemplate(template);
    } catch (BadElementException e) {
        throw new RuntimeException("Couldn't generate PDF from SVG", e);
    } finally {
        graphics.dispose();
    }
}


    private GraphicsNode buildBatikGraphicsNode(String svgStr) throws IOException {
      UserAgent agent = new UserAgentAdapter();

        SVGDocument svgdoc = createSVGDocument(svgStr, agent);
        DocumentLoader loader = new DocumentLoader(agent);
        BridgeContext bridgeContext = new BridgeContext(agent, loader);
        bridgeContext.setDynamicState(BridgeContext.STATIC);

        GVTBuilder builder = new GVTBuilder();

        GraphicsNode imageGraphics = builder.build(bridgeContext, svgdoc);
        return imageGraphics;
}


    private SVGDocument createSVGDocument(String svg, UserAgent agent)
        throws IOException {
    SVGDocumentFactory documentFactory = new SAXSVGDocumentFactory(
            agent.getXMLParserClassName(), true);

    SVGDocument svgdoc = documentFactory.createSVGDocument(null,
            new StringReader(svg));
    return svgdoc;
}

ОБНОВЛЕНИЕ Я попытался прочитать файл SVG с диска, который, как я знал, был правильным, и который правильно помещается в PDF. Так что проблема кроется где-то в генераторе SVG. Кто-нибудь знает об этом?


person Benjamin Larsen    schedule 10.06.2016    source источник
comment
Никто? Я действительно не могу найти ничего, нигде. :-/   -  person Benjamin Larsen    schedule 12.06.2016
comment
После вашего редактирования, где вы исключили pdf, не могли бы вы опубликовать упрощенную версию своего кода, которая содержит только материал svg?   -  person Amedee Van Gasse    schedule 13.06.2016
comment
@AmedeeVanGasse - нужно сделать сейчас, хороший момент. Хотя я все еще верю, что ошибка кроется в строках, использующих синглтон SVGGenerator. Я пытался обновить все пакеты, необходимые для PhantomJS, строго следуя инструкциям с их веб-сайта, но мне все равно не повезло. :)   -  person Benjamin Larsen    schedule 13.06.2016


Ответы (1)


Использование более старой версии PhantomJS (1.9.8) устраняет проблему. Я сделал тикет с Ваадином.

person Benjamin Larsen    schedule 14.06.2016
comment
Хорошо, что вы нашли причину. Я удалил тег itext, чтобы он больше не появлялся в нашем Slack (да, мы в iText Software отслеживаем StackOverflow). - person Amedee Van Gasse; 14.06.2016
comment
Фантастический - отличный сервис. - person Benjamin Larsen; 14.06.2016