0

我在将图表转换为 PDF 时遇到了一些麻烦。最近我发布了这个:使用 iText 和 batik 生成 PDF,按照建议对比例进行一些调整来解决这个问题。

我在 Windows 10 机器上的本地 glassfishserver 上运行 amy testenviroment,当我导出为 PDF 时,我现在实际上得到了一个漂亮的结果。

窗口结果

但是当我将结果推送到 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 生成器的某个地方。有人知道吗?

4

1 回答 1

1

使用旧版本的 PhantomJS (1.9.8) 可以解决这个问题。我已经和 Vaadin 订了票。

于 2016-06-14T07:32:00.577 回答