Java не может открыть PDF с помощью среды выполнения
Я должен открыть PDF при нажатии на JMenuItem. Я могу открыть PDF-файл по щелчку на пункте меню, если я запускаю свою программу из netbeans. Но когда я бегу из файла 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);
}
}
});
Пробовал это тоже, но получаю то же самое... я могу открыть pdf из меню, когда я запускаю из netbeans, но не из jar-приложения.
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);
}
}
}
});
Вывод для всех system.out.println() следующий при запуске из netbeans для этого второго кода
run:
F:/new/build/classes/newpkg/Documentation.pdf F:\new\build\classes\newpkg\Documentation.pdf BUILD SUCCESSFUL (общее время: 5 секунд)
3 ответа
rundll32.exe
не может справиться с ресурсом, который сейчас находится внутри Jar. Проверьте URL, возвращенный getResource(String)
,
..но все еще не работает..
Проблема в том, что rundll32
был, по крайней мере, для PDF, только для File
экземпляров. Инструменты, которые используют (например, отображают) PDF-файлы, как правило, не предназначены для принятия аргументов командной строки. представляя URL
, Если URL
должно оказаться, чтобы указать на File
Процесс может продолжаться. Но если PDF-файл находится в банке, это просто запись в банке. Или, говоря по-другому, это не File
,
Если эти рассуждения верны, один из способов отображения PDF в программном обеспечении по умолчанию:
- Получить
URL
в PDF, как сделано сейчас. - Проверьте, если
URL
указывает на банку (она будет содержать '!'). Если это произойдет..- Извлеките PDF из банки в (временный)
File
на диске.
- Извлеките PDF из банки в (временный)
- Отображение (возможно, временное)
File
,
Можете ли вы использовать Java 6 и Desktop
API?
а при запуске вы можете экспортировать или скачать файл на диск?
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
}