使用ICEpdf在JavaFX应用程序中查看pdf文件?

使用ICEpdf在JavaFX应用程序中查看pdf文件?,java,pdf,javafx,icepdf,Java,Pdf,Javafx,Icepdf,我看过很多关于它的话题,但大部分都是老话题 我是一个新的Java学习者,我尝试构建我的第一个项目,以便我能够应用我所学的知识,该项目的想法很简单,它是一个程序,可以为您带来所有的PDF文件,并显示它们,允许它们被打开和分类,并显示阅读百分比和许多其他内容 我已经完成了有关获取和处理PDF文件以及在用于PDFBox和Derpy库的数据库中添加有关PDF文件的信息的部分,接口部分几乎完成了 它是关于打开PDF文件的。我尝试使用ICEpdf并取得了成功,但我在显示大量PDF文件时遇到了问题,因为字体显

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

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

我已经完成了有关获取和处理PDF文件以及在用于PDFBox和Derpy库的数据库中添加有关PDF文件的信息的部分,接口部分几乎完成了

它是关于打开PDF文件的。我尝试使用ICEpdf并取得了成功,但我在显示大量PDF文件时遇到了问题,因为字体显示不清楚,没有显示的图片也不多,在阿拉伯文PDF文件中,大量文本以方框形式出现

此外,ICEpdf格式不好,很难更改显示语言和格式

我试着使用PDF.js,但没有成功,可能是因为我缺乏经验。 事实上,我在这里看到了使用PDF.js的响应,但它对我不起作用,尽管我根据我的程序编写了相同的代码:

此代码用于使用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();
        });
    }
}

您可以尝试系统属性-Dorg.icepdf.core.awtFontLoading=true。在某些情况下我可以帮忙。这个开源项目最近正在经历一些变化,希望很快会有更好的字体呈现。IIRC有两个ICEpdf版本,免费版本的字体支持较少,付费版本的字体支持非常好。我正在删除PDF.js标签,这是一个单独的项目,您的问题实际上是关于ICEpdf的(当然欢迎您提出更多问题)。我也会稍微澄清你的问题,没有必要道歉。如果你链接到一个无法正确显示的pdf,这也会有所帮助。我知道有一个付费版本,但我试图限制自己使用免费软件,而且在我的领域也没有办法付费。我提到你的pdf.js是为了避免任何人建议它,在我提出问题之前,我会再试一次