首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaFX :使用icepdf显示pdf

JavaFX :使用icepdf显示pdf
EN

Stack Overflow用户
提问于 2015-09-16 22:36:39
回答 2查看 1.7K关注 0票数 3

我正在寻找一种在我的JavaFx应用程序中显示pdf文件的方法。我正在尝试用icePDF来做这件事,但我似乎只找到了swing的代码。现在,我将代码插入到SwingNode中,并将其嵌入到窗格中,但问题是包含icePDF pdf阅读器的JPanel不适合JavaFx窗格的大小。

我是这样做的:

代码语言:javascript
复制
private void handleApercuBtn(){
SwingController controller = new SwingController();

SwingViewBuilder factory = new SwingViewBuilder(controller);

JPanel viewerComponentPanel = factory.buildViewerPanel();

ComponentKeyBinding.install(controller, viewerComponentPanel);

controller.getDocumentViewController().setAnnotationCallback(
  new org.icepdf.ri.common.MyAnnotationCallback(
         controller.getDocumentViewController()));

final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode,viewerComponentPanel);

apercuPane.getChildren().add(swingNode);

controller.openDocument(filePath);
}

如何将包含icePDF阅读器的JPanel放入我的窗格(apercuPane)?我怎么能不使用Swing代码来做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2018-05-31 18:49:16

代码语言:javascript
复制
/**
 * FXML Controller class
 *
 * @author Sudarshan
 */
public class PDFFXMLController implements Initializable {    
    private static String pdfPath;
    private SwingController swingController;
    private JComponent viewerPanel;
    @FXML
    private BorderPane borderPane;  
    /**
     * Initializes the controller class.
     */
  @Override
    public void initialize(URL url, ResourceBundle rb) {
     String pdfPathLoad;
    try {
        pdfPathLoad = loadPDF("http://21-04-2017/17854381660C617.pdf");    
        createViewer(borderPane);
        openDocument(pdfPathLoad );
    } catch (IOException ex) {
        Logger.getLogger(PDFFXMLController.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    private 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, "false");
                properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_ROTATE, "false");
                properties.set(PropertiesManager.PROPERTY_SHOW_TOOLBAR_TOOL, "false");
                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, "false");
                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 e) {
        }
    }
    private void openDocument(String document) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                swingController.openDocument(document);
                viewerPanel.revalidate();
            }
        });
    }
    public String loadPDF(String adresse) throws IOException {
        System.out.println("In load PDf");
        if (!adresse.toLowerCase().endsWith("pdf")) {
            return null;
        }
        String fileName = adresse.substring(adresse.lastIndexOf("/") + 1,
                adresse.lastIndexOf("."));
        String suffix = adresse.substring(adresse.lastIndexOf("."),
                adresse.length());
        File temp = null;
    try {
            InputStream input = new URL(adresse).openStream();
            temp = File.createTempFile(fileName, suffix);
            temp.deleteOnExit();
            Files.copy(input, Paths.get(temp.toURI()),
                    StandardCopyOption.REPLACE_EXISTING);
    } catch (MalformedURLException ex) {
  Logger.getLogger(PDFFXMLController.class.getName()).log(Level.SEVERE, null, ex);
    }
        return temp.getAbsolutePath();
    }

}
票数 1
EN

Stack Overflow用户

发布于 2017-01-16 23:51:08

回答有点晚,但也许有人会发现这在未来会有帮助。这是我们公司的做法。也许有更好的方法来做到这一点,但至少它是有效的。

简而言之,PDF作为IcePDF文档加载,并转换为可显示的图像。

示例代码:

代码语言:javascript
复制
@FXML
private ScrollPane scrollPane;

private final ObjectProperty<ImageView> currentImage;

...

scrollPane.contentProperty().bind(currentImage);

...

org.icepdf.core.pobjects.Document currentDocument = new Document();
try {
    File file = new File("/path/to/pdf");
    currentDocument .setFile(file.getAbsolutePath());
} catch (PDFException | PDFSecurityException | IOException ex) {
    logger.debug("Trying to load file: " + ex);
}

...

private void drawPage(int pageNo) {
    float scale = 1.0f;
    float rotation = 0f;

    // Paint each pages content to an image
    BufferedImage image = (BufferedImage) currentDocument.get().getPageImage(pageNo,
            GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, rotation, scale);

    WritableImage fxImage = javafx.​embed.​swing.SwingFXUtils.toFXImage(image, null);

    if (currentImage.get() != null) {
        currentImage.get().setImage(fxImage);
    } else {
        currentImage.set(new ImageView(fxImage));
    }

    //Clean up
    image.flush();
}

...

drawPage(0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32611666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档