Ни свойства предпочтительного размера, ни их минимальные / максимальные аналоги не позволяют надежно определить размер Region
.Это просто индикаторы, и рассчитанные значения могут не совпадать.Кроме того, Region
может быть изменен до размеров, отличных от предпочтительного размера.Наконец, что не менее важно, эти свойства могут содержать специальные значения Region.USE_PREF_SIZE
(= Double.NEGATIVE_INFINITY
) и Region.USE_COMPUTED_SIZE
(= -1
) и даже делать это по умолчанию.
Если вам нужно получить размерузла, используйте свойство boundsInLocal
:
Bounds bounds = stackPane.getBoundsInLocal();
В этом случае вместо этого проще получить размер снимка.
Кроме того, размер страницы PDPage
можетне быть достаточно большим, чтобы вместить все изображение.Вместо этого вам нужно масштабировать изображение или изменить размер страницы PDPage
.
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + "C:/Users/Andre Kelvin/Desktop/PDFNode.pdf");
. Это можно сделать независимо от платформы с помощью HostServices
, доступного через * 1023.* экземпляр .
пример
@Override
public void start(Stage primaryStage) {
Button button = new Button("print");
StackPane root = new StackPane(button);
button.setOnAction(evt -> {
try {
WritableImage nodeshot = root.snapshot(new SnapshotParameters(), null);
// store image in-memory
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(SwingFXUtils.fromFXImage(nodeshot, null), "png", output);
output.close();
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
PDImageXObject pdimage;
PDPageContentStream content;
pdimage = PDImageXObject.createFromByteArray(doc, output.toByteArray(), "png");
content = new PDPageContentStream(doc, page);
// fit image to media box of page
PDRectangle box = page.getMediaBox();
double factor = Math.min(box.getWidth() / nodeshot.getWidth(), box.getHeight() / nodeshot.getHeight());
float height = (float) (nodeshot.getHeight() * factor);
// beware of inverted y axis here
content.drawImage(pdimage, 0, box.getHeight() - height, (float) (nodeshot.getWidth() * factor), height);
content.close();
doc.addPage(page);
File outputFile = new File("C:/Users/Andre Kelvin/Desktop/PDFNode.pdf");
doc.save(outputFile);
doc.close();
getHostServices().showDocument(outputFile.toURI().toString());
} catch (Exception e) {
}
});
Scene scene = new Scene(root, 300, 300);
primaryStage.setScene(scene);
primaryStage.show();
}