当前位置: 首页 > 面试题库 >

在JavaFX中显示pdf

融修平
2023-03-14
问题内容

开发JavaFX需要显示pdf 的桌面应用程序。我了解到JavaFX(当前版本)不支持pdf查看/显示,我也了解到JPedal

现在,问题:

  1. 是否有任何外部组件或库可以在JavaFX中查看pdf?它应该是一个免费软件。
  2. (如果必须使用JPedal)如何将其嵌入到我的应用程序中。

问题答案:

JPedalFX示例代码和用法

JPedalFX下载提供了有关使用JPedalFX的示例代码。

我有点of脚,但是我只是在这里粘贴从JPedalFX库提供的示例查看器复制的代码段示例代码。该代码依赖于JPedalFX发行版中包含的jpedal_lgpl.jar文件,该文件位于类路径(或应用程序jar清单中引用的库路径)上。

如果您对JPedalFX的使用还有其他疑问,建议您直接与IDR解决方案联系(他们过去一直在响应我)。

// get file path.
FileChooser fc = new FileChooser();
fc.setTitle("Open PDF file...");
fc.getExtensionFilters().add(new FileChooser.ExtensionFilter("PDF Files", "*.pdf"));     
File f = fc.showOpenDialog(stage.getOwner());
String filename = file.getAbsolutePath();

// open file.
PdfDecoder pdf = new PdfDecoder();
pdf.openPdfFile(filename);
showPage(1);
pdf.closePdfFile();

. . .

/**
 * Update the GUI to show a specified page.
 * @param page 
 */
private void showPage(int page) {

    //Check in range
    if (page > pdf.getPageCount())
        return;
    if (page < 1)
        return;

    //Store
    pageNumber = page;


    //Show/hide buttons as neccessary
    if (page == pdf.getPageCount())
        next.setVisible(false);
    else
        next.setVisible(true);

    if (page == 1)
        back.setVisible(false);
    else
        back.setVisible(true);


    //Calculate scale
    int pW = pdf.getPdfPageData().getCropBoxWidth(page);
    int pH = pdf.getPdfPageData().getCropBoxHeight(page);

    Dimension s = Toolkit.getDefaultToolkit().getScreenSize();

    s.width -= 100;
    s.height -= 100;

    double xScale = (double)s.width / pW;
    double yScale = (double)s.height / pH;
    double scale = xScale < yScale ? xScale : yScale;

    //Work out target size
    pW *= scale;
    pH *= scale;

    //Get image and set
    Image i = getPageAsImage(page,pW,pH);
    imageView.setImage(i);

    //Set size of components
    imageView.setFitWidth(pW);
    imageView.setFitHeight(pH);
    stage.setWidth(imageView.getFitWidth()+2);
    stage.setHeight(imageView.getFitHeight()+2);
    stage.centerOnScreen();
}

/**
 * Wrapper for usual method since JFX has no BufferedImage support.
 * @param page
 * @param width
 * @param height
 * @return 
 */
private Image getPageAsImage(int page, int width, int height) {

    BufferedImage img;
    try {
        img = pdf.getPageAsImage(page);

        //Use deprecated method since there's no real alternative 
        //(for JavaFX 2.2+ can use SwingFXUtils instead).
        if (Image.impl_isExternalFormatSupported(BufferedImage.class))
            return javafx.scene.image.Image.impl_fromExternalImage(img);

    } catch(Exception e) {
        e.printStackTrace();
    }

    return null;
}

/**
 * ===========================================
 * Java Pdf Extraction Decoding Access Library
 * ===========================================
 *
 * Project Info:  http://www.jpedal.org
 * (C) Copyright 1997-2008, IDRsolutions and Contributors.
 *
 *  This file is part of JPedal
 *
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


 *
 * ---------------
 * JPedalFX.java
 * ---------------
 */

SwingLabs PDF渲染器

另外,我过去使用带有JavaFX的旧的基于SwingLabs Swing的pdf渲染器为JavaFX
Web浏览器
渲染pdf 。尽管在我开发浏览器时,Swing /
JavaFX集成不是JavaFX的受支持功能,但对我来说仍然可以正常工作。集成代码在PDFViewer.java和BrowserWindow.java中。

需要注意的是在Swing应用程序中嵌入的JavaFX中的Java
2.2的支持和嵌入JavaFX的一个Swing应用程序中的Java 8支持。



 类似资料:
  • 我有这个模型: 我试图有一个表行[String-String-ComboBox with Strings]。所以我像这样设置表格: 但结果是,我在第三列中没有看到任何组合框应该包含值“1”和“3”。相反,我看到的是: 我缺少什么来显示组合框?谢谢

  • 问题内容: 我有一个Foo类,它仅加载FXML并创建场景。 在FXML中,我将控制器设置为FooController() 然后添加一个MenuButton: 我尝试在FooController中设置menuButton: 但是,尽管为MenuButton设置了所有内容,但它并未在GUI中显示任何CheckMenuItems。 如何在FXML中定义的menuButton中加载这些项目? 问题答案:

  • 我想在JavaFX的ImageView中显示图像。图像应该从SQLite数据库中获取,并在场景加载时显示。我使用以下代码片段从数据库获取代码,并在之前创建的ImageView中显示它。但是图像没有按预期显示。我做错了吗?P. S.我测试了改变路径在两个和当读取文件从目录到。但似乎没有什么奏效。但是当我手动将一个图像文件放在src目录中并尝试读取它时,它就像一个魅力。但是我想展示一张从数据库中提取的

  • 我正在尝试从一个数据集创建一个TableView,该数据集由一个具有字符串值的双嵌套ArrayList组成。遗憾的是,我无法在TableView中显示所有值。行没有根据数据集进行编号。 internet的大多数解决方案都表明,我应该使用特定的对象实例。然而,我不是这样工作的。相反,我使用大小不确定的字符串矩阵。数据结构如下: 我最好的(但错误的)结果是通过以下代码实现的: 结果如下: 但是,该表不

  • 问题内容: 我需要帮助弄清楚如何在程序中显示文本,以便它可以在我创建的多边形形状的中间显示“停止”。我想做的是创建一个停车标志。我已经负责创建和显示该停车标志,因此现在只需要在屏幕上显示“停止”即可 } 问题答案: 更换用,并添加到它(多边形后): 关于的Javadoc : StackPane将其子级放在从后到前的堆栈中。子级的z顺序由子级列表的顺序定义,第0个子级是底部,最后一个子级在顶部。如果

  • 我正在自己学习Oracle的JavaFX教程。在做了很多年(很久以前)之后,我对Swing的新智能功能非常着迷,包括。属性。我惊讶地发现,这些示例(例如:https://docs.oracle.com/javafx/2/ui_controls/table-view.htm)并没有以我认为“正确”的方式使用它们。 该示例创建一个类,其属性为字段: 但是getter不是用于属性,而是用于它们的值