0

我一直在尝试使用 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是空的吗?

谢谢并恭祝安康,

托马斯。

4

0 回答 0