Reputation: 433
I want to ask you for help.
I am trying to create a pdf or svg file from the canvas area in the JavaFX application.
PrinterJob.createPrinterJob()
always returns null
. Because I do not have a printer installed locally.
I would appreciate your help.
Upvotes: 1
Views: 908
Reputation: 2569
you need pdfbox libraries https://archive.apache.org/dist/pdfbox/2.0.8/pdfbox-app-2.0.8.jar put the canvas in pane node
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();
}}
Upvotes: 1