首页 > 解决方案 > 使用 ICEpdf 在 JavaFX 应用程序中查看 pdf 文件?

问题描述

我看过很多关于它的话题,但大部分都是旧的。

我是一个新的 Java 学习者,并尝试构建我的第一个项目,以便我可以应用我所学的知识,该项目的想法很简单,它是一个程序,它可以带来您拥有的所有 PDF 文件并为您显示它们并允许它们被打开和分类,并显示阅读百分比和许多其他内容。

我已经完成了与获取和处理 PDF 文件相关的部分,并将有关它们的信息添加到用于该 PDFBox 和 Derpy 库的数据库中,界面部分几乎完成了。

它是关于打开 PDF 文件的。我尝试使用 ICEpdf 并成功了,但是我在显示很多 PDF 文件时遇到了问题,因为字体没有清晰显示,没有很多图片没有出现,而且在阿拉伯 PDF 文件中,很多文本以以下形式出现盒子。

另外,ICEpdf格式不好,很难改变显示语言和格式。

我尝试使用 PDF.js 但未能这样做,可能是因为我缺乏经验。确实,我在这里看到了使用 PDF.js 的响应,但即使我根据我的程序编写了相同的代码,它也对我不起作用: https ://stackoverflow.com/a/42040344/12782195

此代码用于查看 ICEpdf 的 pdf 文件:

import javafx.embed.swing.SwingNode;
import javafx.scene.layout.BorderPane;
import org.icepdf.ri.common.SwingController;
import org.icepdf.ri.common.SwingViewBuilder;
import org.icepdf.ri.util.FontPropertiesManager;
import org.icepdf.ri.util.PropertiesManager;

import javax.swing.*;
import java.lang.reflect.InvocationTargetException;
import java.util.ResourceBundle;

public class PDFFXMLController {

    private SwingController swingController;
    private JComponent viewerPanel;


    public void createViewer(BorderPane borderPane) {
        try {
            SwingUtilities.invokeAndWait(() -> {
                swingController = new SwingController();
                swingController.setIsEmbeddedComponent(true);
                PropertiesManager properties = new PropertiesManager(System.getProperties(),
                        ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE));
                properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_FIT, "true");
                properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_ROTATE, "true");
                properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_TOOL, "true");
                properties.set(PropertiesManager.PROPERTY_DEFAULT_ZOOM_LEVEL, "1.25");
                properties.setBoolean(PropertiesManager.PROPERTY_SHOW_STATUSBAR_VIEWMODE, Boolean.FALSE);
                properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_PAGENAV, "true");
                ResourceBundle messageBundle = ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE);
                new FontPropertiesManager(properties, System.getProperties(), messageBundle);
                swingController.getDocumentViewController().setAnnotationCallback(
                        new org.icepdf.ri.common.MyAnnotationCallback(swingController.getDocumentViewController()));
                SwingViewBuilder factory = new SwingViewBuilder(swingController, properties);
                viewerPanel = factory.buildViewerPanel();
                viewerPanel.revalidate();
                SwingNode swingNode = new SwingNode();
                swingNode.setContent(viewerPanel);
                borderPane.setCenter(swingNode);

                swingController.setToolBarVisible(false);
                swingController.setUtilityPaneVisible(false);
            });
        } catch (InterruptedException | InvocationTargetException ignored) {
        }
    }

    public void openDocument(String document) {
        SwingUtilities.invokeLater(() -> {
            swingController.openDocument(document);
            viewerPanel.revalidate();
        });
    }
}

标签: javapdfjavafxicepdf

解决方案


推荐阅读