Преобразование Javafx-изображения в PDF с отображением половины изображения с помощью PDFBox - PullRequest
0 голосов
/ 14 октября 2018

Я успешно преобразовал изображение в PDF.Моя проблема в том, что PDF отображает половину ширины. Мой код:

@FXML
private 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: enter image description here

И это PDF-файл изображения: enter image description here

1 Ответ

0 голосов
/ 14 октября 2018

Ни свойства предпочтительного размера, ни их минимальные / максимальные аналоги не позволяют надежно определить размер 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();
}
...