2016-07-25 9 views
1

Я использую API DynamicReports для создания отчета в формате PDF, в котором отображаются результаты моего приложения Java (таблицы и диаграммы). Одна из диаграмм, которую я должен показать, - это 3D Surface Plot с использованием jzy3d 0.9.0.Сохранить диаграмму jzy3d в PDF с помощью DynamicReports

Вот мой код:

import static net.sf.dynamicreports.report.builder.DynamicReports.*; 
import net.sf.dynamicreports.examples.Templates; 
import net.sf.dynamicreports.examples.complex.invoice.InvoiceDesign; 
import net.sf.dynamicreports.examples.complex.sales.SalesDesign; 
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder; 
import net.sf.dynamicreports.report.constant.HorizontalImageAlignment; 
import net.sf.dynamicreports.report.constant.HorizontalTextAlignment; 
import net.sf.dynamicreports.report.constant.PageType; 
import net.sf.dynamicreports.report.constant.VerticalImageAlignment; 
import net.sf.dynamicreports.report.constant.VerticalTextAlignment; 
import net.sf.dynamicreports.report.builder.chart.PieChartBuilder; 
import net.sf.dynamicreports.report.builder.component.ComponentBuilder; 
import net.sf.dynamicreports.report.builder.component.ComponentBuilders; 
import net.sf.dynamicreports.report.builder.component.TextFieldBuilder; 
import net.sf.dynamicreports.report.builder.style.FontBuilder; 
import net.sf.dynamicreports.report.builder.style.StyleBuilder; 
import net.sf.dynamicreports.report.constant.PageOrientation; 
import net.sf.dynamicreports.report.datasource.DRDataSource; 
import net.sf.jasperreports.engine.JRDataSource; 
import net.sf.dynamicreports.jasper.builder.export.Exporters; 
import net.sf.dynamicreports.report.builder.column.TextColumnBuilder; 
import net.sf.dynamicreports.report.builder.component.HorizontalListBuilder; 
import javax.swing.JFrame; 
import com.fairdynamics.components.FDPalette; 
import com.fairdynamics.components.FDGlassPane; 
import com.fairdynamics.components.FDOptionPane; 
import fairdynamics.lyrica.UI_VisualAnalytics.UIRespondersHeatMap.HeatMapDetails; 
import javax.swing.ImageIcon; 
import org.jzy3d.maths.*; 
import org.jzy3d.plot3d.builder.*; 
import org.jzy3d.plot3d.builder.concrete.OrthonormalGrid; 
import org.jzy3d.colors.ColorMapper; 
import org.jzy3d.colors.colormaps.ColorMapRainbow; 
import org.jzy3d.plot3d.primitives.Shape; 
import org.jzy3d.chart.Chart; 
import org.jzy3d.plot3d.rendering.canvas.Quality; 
import org.jzy3d.chart.ChartLauncher; 
import org.jzy3d.plot3d.builder.Mapper; 

public class UI_ReportBuilder3 extends JasperReportBuilder{ 
    protected final FontBuilder font18 = stl.font("Roboto Light",false,false,18); 
    protected final FontBuilder font16 = stl.font("Roboto Light",false,false,16); 
    protected final FontBuilder font14 = stl.font("Roboto Light",false,false,14); 
    protected final FontBuilder font12 = stl.font("Roboto Light",false,false,12); 
    protected final FontBuilder font10 = stl.font("Roboto Light",false,false,10); 
    protected final StyleBuilder titleStyle = stl.style(font12).setVerticalTextAlignment(VerticalTextAlignment.TOP).setForegroundColor(FDPalette.primaryColor); 
    protected final StyleBuilder mainTitleStyle = stl.style(font18).setVerticalTextAlignment(VerticalTextAlignment.TOP).setForegroundColor(FDPalette.primaryColor); 
    protected final StyleBuilder subTitleStyle = stl.style(font14).setVerticalTextAlignment(VerticalTextAlignment.TOP).setForegroundColor(FDPalette.primaryColor); 
    protected final StyleBuilder footerStyle = stl.style(font10).setVerticalTextAlignment(VerticalTextAlignment.MIDDLE).setForegroundColor(FDPalette.secondaryText); 
    protected final StyleBuilder colStyle = stl.style(font12).setVerticalTextAlignment(VerticalTextAlignment.MIDDLE); 

    public UI_ReportBuilder3() {   
     try{ 
      this 
      .setTemplate(Templates.reportTemplate) 
      .setPageFormat(PageType.A4,PageOrientation.PORTRAIT) 
      .setPageMargin(margin(40)) 
      .pageFooter(
        cmp.text("Footer").setStyle(footerStyle).setHorizontalTextAlignment(HorizontalTextAlignment.CENTER) 
       ) 
      .title(
        cmp.horizontalList().add(
         cmp.text("TITLE").setStyle(mainTitleStyle).setHorizontalTextAlignment(HorizontalTextAlignment.LEFT) 
        ) 
        .setFixedHeight(32) 
       ) 
      .summary(
        cmp.multiPageList(cmp.image(createHeatMap().screenshot()) 
         ) 
       ) 
      .show() 
      ; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 


    private org.jzy3d.chart.Chart createHeatMap(){   
     // Define a function to plot 
     Mapper mapper = new Mapper() { 
      public double f(double x, double y) { 
       return 10 * Math.sin(x/10) * Math.cos(y/20) * x; 
      } 
     }; 

     // Define range and precision for the function to plot 
     Range range = new Range(-150, 150); 
     int steps = 50; 

     // Create a surface drawing that function 
     org.jzy3d.plot3d.primitives.Shape surface = Builder.buildOrthonormal(new OrthonormalGrid(range, steps, range, steps), mapper); 
     surface.setColorMapper(new ColorMapper(new ColorMapRainbow(), surface.getBounds().getZmin(), surface.getBounds().getZmax(), new org.jzy3d.colors.Color(1, 1, 1, .5f))); 
     surface.setFaceDisplayed(true); 
     surface.setWireframeDisplayed(false); 
     surface.setWireframeColor(org.jzy3d.colors.Color.BLACK); 

     // Create a chart and add the surface 
     org.jzy3d.chart.Chart chart = new org.jzy3d.chart.Chart(Quality.Advanced); 
     chart.getScene().getGraph().add(surface); 

     return chart; 
    } 

} 

Этот код работает только тогда, когда я вызываю метод ChartLauncher.openChart(chart) (следовательно, открывающий кадр с диаграммы отображается в) от createHeatMap() перед возвращением chart, в противном случае createHeatMap().screenshot() всегда возвращает null. Но что делать, если мне нужно создать и экспортировать PDF-файл этой диаграммы, не отображая диаграмму в моем приложении Java?

ПРИМЕЧАНИЕ:, если это возможно, я бы предпочел использовать jzy3d 0.9.0 и не jzy3d 0.9.1, потому что в противном случае я должен изменить много кода уже написаны и протестированы.

+0

Преобразовать его java.awt.Image и передать его как таковой? –

+0

Что следует преобразовать в изображение? Я имею в виду, что класс 'org.jzy3d.chart.Chart' уже предоставляет метод' screenshot() ', но этот метод возвращает null, если диаграмма не отображается должным образом. Проблема в том, что я не хочу отображать диаграмму. – Roberto

+0

У меня нет опыта работы с диаграммой jzy3d только в отчете о яшме. С точки зрения отчетов jasper вам нужно передать изображение, поэтому я предложил изолировать проблему яшмовых отчетов и сосредоточиться только на создании метода, который возвращает java.awt.Image вашей диаграммы (скриншот, рисовать на g2, сохранить в файл ???), лучший способ сделать это с помощью jzy3d, однако я не знаю. –

ответ

0

Возможность захвата экрана следующим образом:

Chart c = AWTChartComponentFactory.chart(Quality.Nicest,org.jzy3d.chart.factories.IChartComponentFactory.Toolkit.offscreen); 
c.screenshot(); 
BufferedImage i = ((OffscreenCanvas)c.getCanvas()).getRenderer()).getLastScreenshotImage(); 

 Смежные вопросы

  • Нет связанных вопросов^_^