JavaFX 和 iText7
JavaFX & iText7
我需要能够向 PDF 文档添加节点。目前我正在将所有节点转换为 FX 可写图像,然后将该图像加载到 iText7 中以创建 PDF 文件。
例如:假设我有一个 JavaFX 条形图,我需要将该条形图添加到一个 PDF 文件中。目前我正在将图表(通过快照)转换为 JavaFX WritableImage,将该图像作为 PNG 文件保存到我的计算机,然后通过
加载该文件
com.itextpdf.layout.element.Image image = new com.itextpdf.layout.element.Image(ImageDataFactory.create(myLocation));
这对我来说似乎有点过分了。如果任何 iText 技术人员看到此消息,我将不胜感激。
简而言之(总而言之)我想要一种将 FX 节点直接添加到 PDF 文件的方法。如果有比 iText 更好的解决方案,我会洗耳恭听。
谢谢
你可以做到
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);
}
}
我需要能够向 PDF 文档添加节点。目前我正在将所有节点转换为 FX 可写图像,然后将该图像加载到 iText7 中以创建 PDF 文件。
例如:假设我有一个 JavaFX 条形图,我需要将该条形图添加到一个 PDF 文件中。目前我正在将图表(通过快照)转换为 JavaFX WritableImage,将该图像作为 PNG 文件保存到我的计算机,然后通过
加载该文件com.itextpdf.layout.element.Image image = new com.itextpdf.layout.element.Image(ImageDataFactory.create(myLocation));
这对我来说似乎有点过分了。如果任何 iText 技术人员看到此消息,我将不胜感激。
简而言之(总而言之)我想要一种将 FX 节点直接添加到 PDF 文件的方法。如果有比 iText 更好的解决方案,我会洗耳恭听。
谢谢
你可以做到
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);
}
}