为了账号安全,请及时绑定邮箱和手机立即绑定

Javafx-Image To PDF 转换使用 PDFBox 显示图像的一半

Javafx-Image To PDF 转换使用 PDFBox 显示图像的一半

Helenr 2021-11-17 14:41:46
我已成功将图像转换为 Pdf。我的问题是 pdf 显示宽度的一半我的代码:@FXMLprivate void print() {    try {        WritableImage nodeshot = stackPane.snapshot(new SnapshotParameters(), null);        File file = new File("C:/Users/Andre Kelvin/Desktop/TheNode.png");        ImageIO.write(SwingFXUtils.fromFXImage(nodeshot, null), "png", file);        PDDocument doc = new PDDocument();        PDPage page = new PDPage();        PDImageXObject pdimage;        PDPageContentStream content;        pdimage = PDImageXObject.createFromFile("C:/Users/Andre Kelvin/Desktop/TheNode.png", doc);        content = new PDPageContentStream(doc, page);        content.drawImage(pdimage, 0, 0);        content.close();        doc.addPage(page);        doc.save("C:/Users/Andre Kelvin/Desktop/PDFNode.pdf");        doc.close();        file.delete();        //This Line Automatically Opens the user defualt pdf file viewer        Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + "C:/Users/Andre Kelvin/Desktop/PDFNode.pdf");    } catch (Exception e) {    }}我尝试使用以下行获取根节点的宽度和高度:content.drawImage(pdimage, 0, 0,(float)stackPane.getPrefWidth(),(float)stackPane.getPrefHeight());和这个:content.drawImage(pdimage, 0, 0,(float)stackPane.getMaxWidth(),(float)stackPane.getMaxHeight());它只会显示一个空白的白页。这是转换为 pdf 的实际图像:这是图像的pdf:
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超12个赞

首选大小属性及其对应的最小/最大属性都不允许您可靠地确定 a 的大小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通过Application实例使用可用的平台独立完成。


例子

@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();

}


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 417 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信