java - 将 jfreechart 导出为 pptx 作为 EMF 图像 - 线条渲染不正确

标签 java apache-poi jfreechart freehep

我正在尝试使用 JFreechart-FreeHEP vector 图形-apache poi XSLF 将时间序列 XY 线图导出到 pptx 文档中。我遵循的逻辑如下

  • 使用 jfreechart 创建图表
  • 使用 freehep api 将图表导出为 emf 图像
  • 使用 apache poi XSLF lib 将此图像添加到 pptx 幻灯片中。

问题在于 EMF 图像中线条的渲染方式。请看下图。渲染的线条并不完全是直的,它们是锯齿状的。水平线渲染为直线,但垂直线不渲染为直线,它们类似于 ->/\/\/\/\/\/\/\/\/\。感谢任何有关将线条渲染为直线的建议。

此问题仅适用于 EMF 格式,我尝试使用 PNG、JPG 格式进行相同操作,线条呈现为直线。我使用 EMF 的原因是,在导出到 pptx 后,其他图片格式(JPEG/PNG/TIF/BMP)似乎失去了质量 - 清晰度和亮度。

Screen shot of EMF image

我使用的代码如下

    chart = createChart(createDataset());
    ChartPanel panel = new ChartPanel(chart);

    EMFGraphics2D emffile = new EMFGraphics2D(new File(
            "C:\\Users\\out\\chart.emf"),
            new Dimension(1500, 600));
    emffile.setDeviceIndependent(true);

    emffile.setRenderingHint(RenderingHints.KEY_RENDERING,
            RenderingHints.VALUE_RENDER_QUALITY);
    emffile.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
            RenderingHints.VALUE_STROKE_NORMALIZE);
    emffile.startExport();
    chart.draw((Graphics2D) emffile.create(), new Rectangle(1500, 600));
    emffile.endExport();
    emffile.closeStream();
    XMLSlideShow pptx = new XMLSlideShow();
    XSLFSlide slide = pptx.createSlide();

    byte[] pptxpic = IOUtils.toByteArray(new FileInputStream(
            "C:\\Users\\out\\chart.emf"));

    int idx = pptx.addPicture(pptxpic, XSLFPictureData.PICTURE_TYPE_EMF);
    XSLFPictureShape pic = slide.createPicture(idx);
    pic.setAnchor(new java.awt.Rectangle(0, 25, 720, 500));

    pptx.write(new FileOutputStream(
            "C:\\Users\\out\\poitest002.pptx"));

最佳答案

通过以较高分辨率保存文件,然后在插入幻灯片时裁剪为较低分辨率来解决此问题。在将图表插入幻灯片之前,该图表已保存为 png 文件。

byte[] pptxpic = null;

ChartUtilities.saveChartAsPNG(pngfile, chart, 1000, 800);

pptxpic = IOUtils.toByteArray(new FileInputStream(pngfile));

int idx = pptxTemplate.addPicture(pptxpic,
                XSLFPictureData.PICTURE_TYPE_PNG);
XSLFPictureShape pic = slidedips.createPicture(idx);

pic.setAnchor(new java.awt.Rectangle(0, 60, 960, 630));

关于java - 将 jfreechart 导出为 pptx 作为 EMF 图像 - 线条渲染不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21502979/

相关文章:

java - 静音和取消静音按钮? (仍然需要一个答案)

Java 2D 数组操作

java - 尝试在 Android 中打开 Excel 文件时不断收到 FileNotFound 异常

java - 在 Spring 中使用 JPA 规范获取要执行的查询

java - 使用 jFreeChart 绘制磁滞回线

java - 如何在 javafx 中打开组合框弹出窗口

java - 无法让 Apache POI autosizeColumn() 正常工作

java - 如何按添加顺序绘制 X、Y 坐标?

java - 调整垂直刻度标签高度 (XYStepChart)

java - 如何在 Android 中查找名称以特定字符串开头的文件夹中的文件