IText、batik 和 vaadin 图表在 linux 上缩放错误
IText, batik and vaadin charts scales wrong on linux
我在将图表导出为 PDF 时遇到了一些问题。
最近我发布了这个:Generating PDF with iText and batik 已按照建议通过对比例进行一些调整来解决。
我 运行 amy testenviroment 在 windows 10 机器上的本地 glassfishserver 上,当我导出为 PDF 时,我现在实际上得到了一个漂亮的结果。
但是当我将结果推送到RHEL服务器时,结果不同。网站上显示的图表很棒,但是当我导出为 pdf 时,我得到这个:
如您所见,标题被下推,出于某种原因,带标签的 Y-axis 被裁剪,data-labels 被压在一起。我尝试过使用不同的比例,有或没有 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;
}
UPDATE 我试过从磁盘读取一个 SVG 文件,我知道它是正确的,并且正确地放入了 PDF 中。所以问题出在 SVG 生成器的某个地方。有人知道吗?
使用旧版本的 PhantomJS (1.9.8) 可以解决这个问题。
我已经和 Vaadin 订好了票。
我在将图表导出为 PDF 时遇到了一些问题。 最近我发布了这个:Generating PDF with iText and batik 已按照建议通过对比例进行一些调整来解决。
我 运行 amy testenviroment 在 windows 10 机器上的本地 glassfishserver 上,当我导出为 PDF 时,我现在实际上得到了一个漂亮的结果。
但是当我将结果推送到RHEL服务器时,结果不同。网站上显示的图表很棒,但是当我导出为 pdf 时,我得到这个:
如您所见,标题被下推,出于某种原因,带标签的 Y-axis 被裁剪,data-labels 被压在一起。我尝试过使用不同的比例,有或没有 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;
}
UPDATE 我试过从磁盘读取一个 SVG 文件,我知道它是正确的,并且正确地放入了 PDF 中。所以问题出在 SVG 生成器的某个地方。有人知道吗?
使用旧版本的 PhantomJS (1.9.8) 可以解决这个问题。 我已经和 Vaadin 订好了票。