IText, Batik и Vaadin диаграммы неправильно масштабируются на Linux

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

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

Результат Windows

Но когда я отправил результаты на сервер RHEL, результаты отличались. Графики, показанные на сайте, великолепны, но когда я экспортирую в pdf, я получаю это:

Linux результат

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

Кто-нибудь знает, что происходит - и даже лучше, как это исправить? Я дважды проверил, что 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 Generator. Кто-нибудь знает об этом?

1 ответ

Решение

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

Другие вопросы по тегам