0

JFreechart-FreeHEP vector graphics-apache poi XSLF を使用して、時系列の XY 折れ線グラフを pptx ドキュメントにエクスポートしようとしています。私が従うロジックは以下の通りです

  • jfreechart を使用してチャートを作成する
  • freehep API を使用してグラフを emf イメージとしてエクスポートする
  • apache poi XSLF lib を使用して、この画像を pptx スライドに追加します。

問題は、EMF イメージで線がレンダリングされる方法にあります。下の画像をご覧ください。レンダリングされた線は正確には直線ではなく、ジグザグのようなものです。水平線はまっすぐにレンダリングされますが、垂直線は直線としてレンダリングされず、 -> /\/\/\/\/\/\/\/\/\ のようになります。線を直線としてレンダリングするための提案をいただければ幸いです。

この問題は EMF 形式でのみ発生します。PNG、JPG 形式で同じことを試してみましたが、線は直線としてレンダリングされます。私が EMF を使用している理由は、pptx にエクスポートした後、他の画像形式 (JPEG/PNG/TIF/BMP) が品質 (鮮明さと明るさ) を失うように見えるためです。

EMF 画像のスクリーンショット

私が使用しているコードは以下のとおりです

    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"));
4

1 に答える 1

1

ファイルを高解像度で保存し、スライドに挿入するときに低解像度にトリミングすることで、この問題を修正しました。グラフは、スライドに挿入する前に 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));
于 2014-07-16T00:34:30.447 に答える