我一直在尝试使用 XChart 组成一个饼图,然后将其矢量化为 SVG 格式,以便在使用 PDFBox 构建的 PDF 中使用它。
为此,我使用:
- XChart 用于构建饼图并将其矢量化;
- SVGSalamender 用于基于先前 SVG 矢量化的 Graphics2D 构建;
- PDFBoxGraphics2D 用于将以前的 Graphics2D 添加到我的 PDF。
一切运行良好(编译和运行没有错误),但它不起作用。输出 PDF 保持为空。
这是我的代码:
@Test
public void test() {
try {
PieChart camembertXChart = camembertXChart();
BufferedImage imageCamembertXChart = BitmapEncoder.getBufferedImage(camembertXChart);
ByteArrayOutputStream output = new ByteArrayOutputStream();
File svg = new File("F:\\Users\\mangin\\Desktop\\Camembert_XChart.svg");
VectorGraphicsEncoder.saveVectorGraphic(camembertXChart, svg.getName(), VectorGraphicsFormat.SVG);
byte[] data = output.toByteArray();
FileInputStream input = new FileInputStream(svg);
BufferedImage imageCamembertXChartVectorise = ImageIO.read(input);
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contenu = new PDPageContentStream(document, page, AppendMode.APPEND, false, true);
PdfBoxGraphics2D pdfBoxGraphics2D = new PdfBoxGraphics2D(document, 200, 200);
// SVG Salamander
SVGUniverse universSVG = new SVGUniverse();
SVGDiagram diagramSVG = universSVG.getDiagram(universSVG.loadSVG(svg.toURI().toURL()));
diagramSVG.render(pdfBoxGraphics2D);
pdfBoxGraphics2D.dispose();
var xform = pdfBoxGraphics2D.getXFormObject();
var transform = AffineTransform.getTranslateInstance(200, 200);
xform.setMatrix(transform);
contenu.drawForm(xform);
contenu.close();
document.save("D://tests/archi/PDF_avec_elements_graphique.pdf");
document.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private PieChart camembertXChart() {
PieChart camembert2 = new PieChartBuilder().width(200).height(200).build();
Color[] sliceColors = new Color[] {
new Color(183, 203, 231),
new Color(131, 173, 219),
new Color(84, 143, 197),
new Color(70, 120, 165) };
camembert2.getStyler().setSeriesColors(sliceColors);
camembert2.getStyler().setLegendVisible(false);
camembert2.getStyler().setPlotBorderVisible(false);
camembert2.getStyler().setChartTitleVisible(false);
camembert2.getStyler().setChartTitleBoxVisible(false);
camembert2.getStyler().setChartPadding(0);
camembert2.getStyler().setChartTitlePadding(0);
camembert2.getStyler().setBorderWidth(3);
camembert2.getStyler().setAnnotationsFont(new Font("Arial", Font.BOLD, 10));
camembert2.getStyler().setAnnotationsFontColor(Color.WHITE);
camembert2.addSeries("Item 1", 9);
camembert2.addSeries("Item 2", 10);
camembert2.addSeries("Item 3", 23);
camembert2.addSeries("Item 4", 58);
return camembert2;
}
有没有人有类似开发的经验?或者有人知道为什么PDF是空的吗?
谢谢并恭祝安康,
托马斯。