打开带参数的PDF文件

时间:2014-10-13 16:13:48

标签: java pdfbox runtime.exec

我正在开发一个基于java的工具,它应该搜索所选目录上的PDF文件,并且应该搜索此PDF文件中的特殊单词/句子。之后,JList显示适合的文件,双击其中一个条目,PDF Reader(Adobe Reader)应直接在出现单词/句子的页面上打开此文件。

我尝试了两件不同的事情。

的Runtime.exec:

try{
    Runtime.getRuntime().exec("rundll32" + " " + "url.dll,FileProtocolHandler /A page=4" + " " + o.toString()); 
}catch(IOException ex) { 
    ex.printStackTrace(); 
}

桌面打开:

if(Desktop.isDesktopSupported()) {
    try{
        Desktop d = Desktop.getDesktop();
        d.open(new File(o.toString()));
    }catch(IOException ex) {
        ex.printStackTrace();
    }
}

有没有办法使用" page = 4"等参数启动PDF阅读器?直接跳到右边的页面?

提前致谢

1 个答案:

答案 0 :(得分:3)

您可能遇到的一个问题是,如果不是在计算机的路径中,则无法直接调用acrobat。该解决方案使用两个Windows命令:assoc and ftype来检索acrobat可执行路径。

找到后,您只需按照预期在Acrobat的文档中构建命令行:

<Acrobat path> /A "<parameter>=<value>" "<PDF path>"

我带来了以下解决方案:

public void openPdfWithParams(File pdfFile, String params){

    try {
        //find the file type of the pdf extension using assoc command
        Process p = Runtime.getRuntime().exec("cmd /c assoc .pdf");
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = reader.readLine();
        String type = line.substring(line.indexOf("=")+1); //keeping only the file type
        reader.close();

        //find the executable associated with the file type usng ftype command
        p = Runtime.getRuntime().exec("cmd /c ftype "+type);
        p.waitFor();
        reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        line = reader.readLine();
        reader.close();
        String exec = line.substring(line.indexOf("=")+1); //keeping only the command line


        //building and executing the final command
        //the command line ends with "%1" to pass parameters - replacing it by our parameters and file path
        String commandParams= String.format("/A \"%s\" \"%s\"", params ,pdfFile.getAbsolutePath()); 
        String command = exec.replace("\"%1\"", commandParams);
        p = Runtime.getRuntime().exec(command);


    } catch (Exception e) {
        logger.log(Level.SEVERE, "Error while trying to open PDF file",e );
        e.printStackTrace();
    }
}

请注意,为了便于阅读,代码非常乐观,必须进行多项测试以确保命令返回预期结果。此外,此代码具有Java6语法,这肯定有利于升级到Java7&#34;尝试使用资源&#34;和nio。