2016-07-25 24 views
1

Ich verwende DynamicReports API, um einen PDF-Bericht zu erstellen, der die Ergebnisse meiner Java Anwendung (Tabellen und Diagramme) anzeigt. Eines der Diagramme, die ich anzeigen muss, ist ein 3D Surface Plot Build mit jzy3d 0.9.0.Speichern Sie jzy3d Diagramm im PDF mit DynamicReports

Hier ist mein Code:

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; 
    } 

} 

Dieser Code funktioniert nur, wenn ich die Methode nennen ChartLauncher.openChart(chart) (folglich eine Rahmenöffnung mit der Karte angezeigt in) von createHeatMap() vor chart Rückkehr, sonst createHeatMap().screenshot() immer wieder null. Was aber, wenn ich ein PDF dieses Diagramms erstellen und exportieren muss, ohne das Diagramm selbst in meiner Java-Anwendung anzuzeigen?

HINWEIS: wenn möglich, würde ich es vorziehen, jzy3d 0.9.0 und nicht jzy3d 0.9.1 zu verwenden, da sonst soll ich eine Menge Code bereits geschrieben und getestet ändern.

+0

wandeln es in java.awt.Image und geben sie als solche? –

+0

Was soll ich in Image konvertieren? Ich meine, die 'org.jzy3d.chart.Chart' Klasse bietet bereits eine' screenshot() 'Methode, aber diese Methode gibt null zurück, wenn das Diagramm nicht richtig angezeigt wird. Das Problem ist, dass ich das Diagramm nicht anzeigen möchte. – Roberto

+0

Ich habe keine Erfahrung mit jzy3d Diagramm nur in jasper Bericht. Aus Sicht von Jaspis-Berichten müssen Sie Image übergeben, deshalb habe ich vorgeschlagen, das Problem von Jaspis-Berichten zu isolieren und nur eine Methode zu erstellen, die ein java.awt.Image Ihres Diagramms zurückgibt (Screenshot, zeichne zu g2, Speichern in Datei ???), der beste Weg, dies mit jzy3d zu tun, aber ich weiß es nicht. –

Antwort

0

Able den Screenshot auf diese Weise zu erfassen:

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