提问者:小点点

如何在javafx桌面应用程序中从字节[]打开pdf文件[关闭]


编辑问题以包括所需的行为、特定的问题或错误以及重现问题所需的最短代码。这将有助于其他人回答问题。

我有一个数据库,其中pdf文件存储为byte[],我需要在javafx应用程序中显示这些pdf。

我尝试使用HostServices,但这只接受来自本地文件的字符串。


共1个答案

匿名用户

要在JavaFX应用程序中显示存储为byte[]的PDF文件,您可以使用ByteArrayInputStream类从字节数组创建InputStream。然后,您可以使用Apache PDFBox库中的PDFViewer类在JavaFX WebView中显示PDF内容。

这是一个示例代码片段,演示了如何执行此操作:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.rendering.PDFRenderer;

public class PDFViewerExample extends Application {

    private byte[] pdfData; // The PDF data stored as a byte array

    @Override
    public void start(Stage primaryStage) throws IOException {
        // Create an input stream from the PDF data
        ByteArrayInputStream inputStream = new ByteArrayInputStream(pdfData);

        // Load the PDF document
        PDDocument document = PDDocument.load(inputStream);

        // Render the first page of the PDF document to an image
        PDFRenderer renderer = new PDFRenderer(document);
        PDPage page = document.getPage(0);
        int dpi = 72;
        javafx.scene.image.Image image = new javafx.scene.image.Image(
                renderer.renderImageWithDPI(0, dpi),
                page.getCropBox().getWidth() / dpi,
                page.getCropBox().getHeight() / dpi,
                false,
                true
        );

        // Create a WebView to display the PDF image
        WebView webView = new WebView();
        webView.getEngine().loadContent("<html><body><img src='data:image/png;base64," + java.util.Base64.getEncoder().encodeToString(toByteArray(image)) + "' /></body></html>");

        // Create a scene and display it in the stage
        Scene scene = new Scene(webView);
        primaryStage.setScene(scene);
        primaryStage.show();

        // Close the PDF document
        document.close();
    }

    public static void main(String[] args) {
        launch(args);
    }
    
    // Helper method to convert a JavaFX Image to a byte array
    public static byte[] toByteArray(javafx.scene.image.Image image) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
        ImageIO.write(bufferedImage, "png", outputStream);
        return outputStream.toByteArray();
    }

}

在此示例中,pdfData字节数组包含要显示的PDF内容。代码使用ByteArrayInputStream类从字节数组创建输入流,然后使用Apache PDFBox库中的PDDocument类加载PDF文档。

然后,代码使用PDFBox中的PDFRender类将PDF文档的第一页渲染为JavaFXImage。然后,将Image转换为Base64编码的字符串,用于在WebView中显示图像。

请注意,此代码假定您在项目中安装并配置了Apache PDFBox库和JavaFXSDK。