2016-11-03 1 views
1

Je dois pouvoir ajouter des noeuds à un document PDF. Actuellement, je convertis tous les nœuds en une image inscriptible FX, puis en chargeant cette image dans iText7 pour créer un fichier PDF. Par exemple: disons que j'ai un BarChart JavaFX et que j'ai besoin d'ajouter ce BarChart dans un fichier PDF. Actuellement, je suis convertir le graphique (par cliché) à un JavaFX WritableImage sauver cette image sur mon ordinateur comme un fichier PNG charger ensuite ce fichier viaJavaFX & iText7

com.itextpdf.layout.element.Image image = new com.itextpdf.layout.element.Image(ImageDataFactory.create(myLocation)); 

Ce me semble un peu excessif. Si l'une des personnes de la technologie iText voit cela, j'apprécierais vraiment une réponse.

En bref (et en résumé) je voudrais un moyen d'ajouter un nœud FX directement à un fichier PDF. S'il y a une meilleure solution que iText pour le faire, je suis tout ouïe.

Merci

Répondre

2

Vous pouvez faire

javafx.scene.image.Image fxImage = chart.snapshot(null, null); 
java.awt.Image awtImage = SwingFXUtils.fromFXImage(fxImage); 
com.itextpdf.layout.element.Image pdfImage = 
    new com.itextpdf.layout.element.Image(ImageDataFactory.create(awtImage, null)); 

SSCCE:

import java.io.File; 
import java.io.FileOutputStream; 
import java.util.Random; 

import com.itextpdf.io.image.ImageData; 
import com.itextpdf.io.image.ImageDataFactory; 
import com.itextpdf.kernel.pdf.PdfDocument; 
import com.itextpdf.kernel.pdf.PdfWriter; 
import com.itextpdf.layout.Document; 

import javafx.application.Application; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.chart.BarChart; 
import javafx.scene.chart.CategoryAxis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart.Data; 
import javafx.scene.chart.XYChart.Series; 
import javafx.scene.control.Button; 
import javafx.scene.image.Image; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.FileChooser; 
import javafx.stage.FileChooser.ExtensionFilter; 
import javafx.stage.Stage; 

public class ITextTest extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     BarChart<String, Number> chart = new BarChart<>(new CategoryAxis(), new NumberAxis()); 
     Random rng = new Random(); 
     Series<String, Number> series = new Series<>(); 
     series.setName("Data"); 
     for (int i = 1 ; i<=10; i++) { 
      series.getData().add(new Data<>("Group "+i, rng.nextDouble())); 
     } 
     chart.getData().add(series); 

     Button save = new Button("Save to pdf"); 
     FileChooser chooser = new FileChooser(); 
     chooser.getExtensionFilters().add(new ExtensionFilter("PDF files", "*.pdf")); 
     save.setOnAction(e -> { 
      File file = chooser.showSaveDialog(primaryStage); 
      if (file != null) { 
       try { 
        Image img = chart.snapshot(null, null); 
        ImageData imgData = ImageDataFactory.create(SwingFXUtils.fromFXImage(img, null), null); 
        com.itextpdf.layout.element.Image pdfImg = new com.itextpdf.layout.element.Image(imgData); 

        PdfWriter writer = new PdfWriter(new FileOutputStream(file)); 
        PdfDocument pdfDoc = new PdfDocument(writer); 
        Document doc = new Document(pdfDoc); 
        doc.add(pdfImg); 
        doc.close(); 
       } catch (Exception exc) { 
        exc.printStackTrace(); 
       }    
      } 
     }); 

     BorderPane.setAlignment(save, Pos.CENTER); 
     BorderPane.setMargin(save, new Insets(10)); 
     BorderPane root = new BorderPane(chart, null, null, save, null); 

     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 


    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Donc cela rend le processus un peu plus simple buuuuut enregistrer les images au format PDF par le biais instantané rend au sérieux l'impression ressembler à c'est à partir des années 90 lol. C'est pourquoi je voulais un moyen d'ajouter le noeud directement. –

+0

@PhilipVaughn Expérimentez en créant des nœuds 2 ou 4 fois plus grands que nécessaire et en redimensionnant l'image. –

+0

J'ai aussi lutté avec ça. La taille des nœuds est évidemment déterminée par la taille de l'écran, donc j'ai fini par lier la taille du, disons tableview, à la taille de la scène (ce qui est déterminé par l'ampleur de l'écran). Quoi qu'il en soit, lorsque j'imprime, je suppose automatiquement que le format de la page est un format de lettre standard et que l'image est mise à l'échelle des marges d'une feuille normale de papier d'imprimante. Donc, en fonction de la taille du nœud pour commencer, il déterminera le montant qu'il met à l'échelle. Je vous ai donné la réponse acceptée ici parce qu'il semble qu'il n'y a vraiment aucun moyen de faire ce que je veux. –