2015-09-16 24 views
2

我正在寻找一种方法来显示我的JavaFx应用程序中的PDF文件。我试图用icePDF做到这一点,但我似乎只能找到摆动的代码。现在我将代码插入SwingNode并将其嵌入到窗格中,但问题是包含icePDF pdf阅读器的JPanel不符合JavaFx窗格的大小。JavaFX:显示pdf与icepdf

这是我要做的事:

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读者到我的窗格(apercuPane)的JPanel的?我怎样才能不使用Swing代码来做到这一点?

+0

我想太了解:) – GlacialMan

回答

0

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

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

示例代码:

@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);