java - 如何从 JavaFX 应用程序的画布区域创建 PDF 或 SVG 文件?
问题描述
我想请你帮忙。
我正在尝试从 JavaFX 应用程序的画布区域创建 pdf 或 svg 文件。
PrinterJob.createPrinterJob()
总是返回null
。因为我没有在本地安装打印机。
我会很感激你的帮助。
解决方案
你需要 pdfbox 库https://archive.apache.org/dist/pdfbox/2.0.8/pdfbox-app-2.0.8.jar 将画布放在窗格节点中
package nodetopdf;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.Button;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
public class NodeToPdf extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setTranslateY(100);
btn.setText("To Pdf'");
Canvas canvas = new Canvas(200, 200);
Pane pane = new Pane(canvas);
Rectangle rectangle1 = new Rectangle(100, 50, Color.RED);
pane.getChildren().addAll(rectangle1,btn);
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println(" button pressed");
WritableImage nodeshot = pane.snapshot(new SnapshotParameters(),
null);
File file = new File("pane.png");
try {
ImageIO.write(SwingFXUtils.fromFXImage(nodeshot, null), "png", file);
} catch (IOException e) {
}
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
PDImageXObject pdimage;
PDPageContentStream content;
try {
pdimage = PDImageXObject.createFromFile("pane.png",doc);
content = new PDPageContentStream(doc, page);
content.drawImage(pdimage, 100, 100);
content.close();
doc.addPage(page);
doc.save("pdf_file.pdf");
doc.close();
file.delete();
} catch (IOException ex) {
Logger.getLogger(NodeToPdf.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
StackPane root = new StackPane();
root.getChildren().add(pane);
Scene scene = new Scene(root, 600, 600);
primaryStage.setScene(scene);
primaryStage.show();
}}
推荐阅读
- sql - 查询有效约会的条件案例
- azure - 创建自定义 Azure RBAC 角色以允许用户在 portal.azure.com 中交换插槽
- c++ - 如何为 .txt 文件字符串编程不同的输出
- java - Struts2、Guice 和 index.jsp
- php - 如何在服务(Symfony4)中解析 FormBuilder?
- java - Bouncy Castle ECDSA 生成不正确的签名
- c# - 市场数据的正则表达式
- typescript - 尝试使 Redux 与 Typescript 一起使用时,参数 'action' 应该具有可分配给 'Object' 的类型
- r - 创建一个从R中的for循环中提取它的变量
- swift - 通过比较实例属性类型和泛型参数来约束泛型函数