2016-11-03 2 views
1

Мне нужно иметь возможность добавлять узлы в документ PDF. В настоящее время я конвертирую все узлы в загружаемое на FX изображение, а затем загружаю это изображение в iText7 для создания PDF-файла.JavaFX & iText7

Например: сказать, что у меня есть JavaFX BarChart, и мне нужно добавить этот BarChart в файл PDF. В настоящее время я преобразование диаграммы (через снимок) к JavaFX WritableImage экономии, что изображение на мой компьютер в качестве PNG-файла последующей загрузки этого файла через

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

это мне кажется совсем немного чрезмерным. Если кто-либо из техников iText видит это, я бы очень благодарен за ответ.

Вкратце (и в резюме) Я хотел бы, чтобы добавить узел FX непосредственно в файл PDF. Если для этого есть лучшее решение, чем iText, я все уши.

Благодаря

ответ

2

Вы можете сделать

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

Таким образом, это делает процесс немного проще buuuuut сохранять изображения в PDF с помощью снимка серьезно делает распечатку выглядеть, как это с 90-х годов. Вот почему я хотел, чтобы добавить узел напрямую. –

+0

@PhilipVaughn Эксперимент с созданием узлов, которые в 2 или 4 раза больше, чем вам нужно, а затем уменьшают масштаб изображения. –

+0

Я тоже боролся с этим. Размер узлов определяется размером экрана, очевидно, поэтому я фактически привязал размер, скажем, tableview, к размеру сцены (которая определяется масштабностью экрана). В любом случае, когда я печатаю, я автоматически предполагаю, что размер страницы является бумагой формата стандартного письма и масштабирует изображение до полей обычного листа бумаги принтера. Поэтому, основываясь на размере узла для начала, будет определяться величина, которую он масштабирует. Я дал вам принятый ответ, потому что кажется, что действительно нет способа делать то, что я хочу. –

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