Java无法使用Runtime打开pdf

时间:2011-07-05 05:34:45

标签: java actionlistener netbeans-7 runtime.exec jsr296

我必须在点击JMenuItem时打开pdf。如果我从netbeans运行我的程序,我可以点击菜单项打开pdf。但是当我从jar文件运行时它没有打开。我清理并构建我的项目。但没有变化。从netbeans运行但不从jar文件运行时运行。 我需要添加一些库吗?

我的代码如下

m_aboutItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Runtime rt = Runtime.getRuntime();
           //System.out.println(Menubar1.getDefaultLocale());
                URL link2=Menubar1.class.getResource("/newpkg/Documentation.pdf");
                String link=link2.toString();
                link=link.substring(6);
                System.out.println(link);
                System.out.println(link2);
                String link3="F:/new/build/classes/newpkg/Documentation.pdf";
                try {
                Process proc = rt.exec("rundll32.exe url.dll,FileProtocolHandler " + link2);
            } catch (IOException ex) {
                Logger.getLogger(Menubar1.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    });

也试过这个但是得到同样的东西..当我从netbeans运行而不是从jar应用程序运行时,我可以从menuitem打开pdf。

m_aboutItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (Desktop.isDesktopSupported()) {
            Desktop desktop = Desktop.getDesktop();
            URL link2=Menubar1.class.getResource("/newpkg/Documentation.pdf");
                String link=link2.toString();
                link=link.substring(6);
                System.out.println(link); 
            File file=new File(link);
            System.out.println(file);
                try {
                    desktop.open(file);
                } catch (IOException ex) {
                    Logger.getLogger(Menubar1.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        }
    });

从netbeans为第二个代码运行时,所有system.out.println()的输出如下

run:

F:/new/build/classes/newpkg/Documentation.pdf F:\新\建造\类\ newpkg \ Documentation.pdf 建立成功(总时间:5秒)

3 个答案:

答案 0 :(得分:1)

rundll32.exe无法处理现在位于Jar内的资源。检查getResource(String)返回的网址。

  

..但仍然无法正常工作..

问题是rundll32至少对于File个实例来说只是URL个实例。消耗(例如显示)PDF的工具通常不被设计为接受命令行参数。代表URL。如果File应该指向File,则该过程可以继续。但是一旦PDF在Jar中,它就只是Jar中的一个条目。或者换句话说,不是URL

如果推理正确,在默认软件中显示PDF的一种方法是:

  1. 立即获取URL到PDF。
  2. 检查File是否指向Jar(它将包含'!')。如果它..
    1. 将PDF中的PDF解压缩到磁盘上的(临时)File
  3. 显示(可能是临时的){{1}}。

答案 1 :(得分:1)

您可以使用Java 6和Desktop API吗?

并且在启动时可以将文件导出或下载到磁盘吗?

答案 2 :(得分:0)

 try                                      //try statement
     {
         Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + "c:\\chart.pdf");   //open the file chart.pdf

     } catch (Exception e)                    //catch any exceptions here
       {
           System.out.println("Error" + e );  //print the error
       }