У меня возникли проблемы с получением моих диаграмм в формате PDF. Недавно я разместил это: Generating PDF with iText and batik, которое было решено, как было предложено, с некоторой настройкой на весы.Таблицы IText, батик и ваадин масштабируются неправильно на linux
Я запускаю amy testenviroment на локальном стеклянном стекле на машине с окнами 10, и когда я экспортирую в PDF, на самом деле получаю прекрасный результат.
Но когда я толкнул результаты на сервер RHEL, результаты различались. Диаграммы, представленные на сайте является большим, но когда я экспортировать в PDF, я получаю это:
Как вы можете видеть, название выталкивается вниз, по какой-то причине 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;
}
UPDATE Я попытался чтении SVG файла с диска, который я знал, был правильным, и что правильно поместить в PDF. Таким образом, проблема лежит где-то в генераторе SVG. Кто-нибудь знает об этом?
Никто? Кажется, я ничего не могу найти. : -/ –
После вашего редактирования, где вы исключили PDF, вы могли бы опубликовать упрощенную версию вашего кода, которая содержит только материал svg? –
@AmedeeVanGasse - должно быть сделано сейчас, хорошая точка. Хотя я все еще верю, что ошибка лежит внутри линий, которые используют синглтон SVGGenerator. Я пробовал обновлять все пакеты, требуемые PhantomJS, строго следуя инструкциям со своего сайта, но мне все равно не повезло. :) –