2010-09-01 2 views
1

Я создаю приложение Java, которое создает 4 файла PDF с помощью iText. На том, что создает PDF с изображением в нем, .jar создает файл с 0 байтами и не продолжает выполнение. Тем не менее, когда я прямо щелкните >> Запуск как >> Java-приложение, он работает отлично. Для того, чтобы создать банку, я делаю следующееJava-приложение работает правильно в Eclipse, но не как .jar

  • Нажмите правой кнопкой SRC
  • Экспорт
  • Runnable JAR файл
  • Извлечение необходимых библиотек в генерируемой JAR
  • Закончите

И файл «penguin.jpg» находится в каталоге src.

Вот мой код

import com.itextpdf.text.*; 
import com.itextpdf.text.pdf.PdfPTable; 
import com.itextpdf.text.pdf.PdfWriter; 
import java.io.FileOutputStream; 

public class ITextHelloWorld 
{ 
    public ITextHelloWorld() throws Exception 
    { 
     // Create the new document objects 
     Document helloWorld = new Document(); 
     Document bigHello = new Document(); 
     Document linux = new Document(); 
     Document tables = new Document(); 


    /********************************************************** 
         start Big Hello.pdf 
    This document is a huge document of text. Approximately 
    28 million characters, 24,391 pages, and 9.5 MB. 
    **********************************************************/ 
    PdfWriter.getInstance(bigHello, new FileOutputStream("Big Hello.pdf")); 
    bigHello.open(); 

    for (int i=0; i <1000000; i++) 
    { 
     bigHello.add(new Paragraph("Hello World. It's me again.")); 
    } 

    bigHello.close(); 
    /********************************************************** 
         end Big Hello.pdf 
    **********************************************************/ 

    /********************************************************** 
         start Tables.pdf 
    This document will have tables in it 
    **********************************************************/ 

    PdfWriter.getInstance(tables, new FileOutputStream("Tables.pdf")); 
    tables.open(); 

    PdfPTable table=new PdfPTable(4); 
    for (int i = 1; i<100; i++) 
    {  
     table.addCell("This is cell #" + i + ".\n"); 
    } 

    tables.add(table); 
    tables.close(); 
    /********************************************************** 
         end Tables.pdf 
    **********************************************************/ 

    /********************************************************** 
         start Linux.pdf 
    This is a document that has text, graphics, and links. 
    **********************************************************/ 
    PdfWriter.getInstance(linux, new FileOutputStream("Graphics and Text.pdf")); 
    linux.open();  
    Image image = Image.getInstance("penguin.jpg"); 
    linux.add(image); 

    linux.add(new Paragraph("Let's talk about Linux. \n\n" + 
      "Linux (commonly pronounced /ˈlɪnəks/ LIN-əks in American English, also pronounced " + 
      "/ˈlɪnʊks/ LIN-ooks in Europe and Canada) refers to the family of Unix-like computer " + 
      "operating systems using the Linux kernel. Linux can be installed on a wide variety of " + 
      "computer hardware, ranging from mobile phones, tablet computers and video game consoles, " + 
      "to mainframes and supercomputers. Linux is predominantly known for its use " + 
      "in servers; in 2009 it held a server market share ranging between 20–40%. Most desktop " + 
      "computers run either Microsoft Windows or Mac OS X, with Linux having anywhere from a " + 
      "low of an estimated 1–2% of the desktop market to a high of an estimated 4.8%. " + 
      "However, desktop use of Linux has become increasingly popular in recent years, partly " + 
      "owing to the popular Ubuntu, Fedora, Mint, and openSUSE distributions and the emergence" + 
      " of netbooks and smartphones running an embedded Linux.")); 

    linux.close(); 
    /********************************************************** 
         end Linux.pdf 
    **********************************************************/ 

    /********************************************************** 
         start Hello World.pdf 
    This document is one line of text. 
    **********************************************************/ 
    PdfWriter.getInstance(helloWorld, new FileOutputStream("Hello World.pdf")); 
    helloWorld.open(); 
    helloWorld.add(new Paragraph("Hello World. It's me again.")); 
    helloWorld.close(); 
    /********************************************************** 
         end Hello World.pdf 
    **********************************************************/ 

} 

public static void main (String args[]) 
{ 
    try 
    { 
     new ITextHelloWorld(); 
    } 

    catch (Exception e) 
    { 
     System.out.println(e); 
    } 
} 

}

Спасибо за любую помощь!
Thomas

+2

Вы видите какие-либо сообщения об ошибках при запуске JAR? –

+0

Нет, я не получаю сообщений об ошибках. Файл «Graphics and Text.pdf» просто не создан. – Thomas

+0

im пытается узнать, возможно ли что-то: как вы управляете банкой? jar runnable в командной строке, например .exe? – djangofan

ответ

2

В догадке, проблема заключается в этой строке:

Image image = Image.getInstance("penguin.jpg"); 

Поскольку это находится в каталоге Src, это будет в конечном итоге в файле JAR. Однако вы не можете напрямую загружать файлы из JAR-файла только с именем файла.

Однако Image.getInstance имеет an overload, который принимает URL, что делает это довольно легко:

Image image = Image.getInstance(this.getClass().getResource("/penguin.jpg")); 

/корень каталога ЦСИ или банку файла (ов), а не корневой файловой системы, в случае, если «Интересно.

+0

Спасибо! это сработало. – Thomas

+0

@Powerlord Я использую itext 7. Какой метод мне нужно использовать. Я не смог найти метод 'Image.getInstance' в API [itext 7 API] (http://itextsupport.com/apidocs/itext7 /7.0.1/) – Pradeep

4

Thomas, проблема в том, что когда вы создаете банку, вы «испортите» структуру каталогов. Вам нужно извлечь изображение из банки, используя следующий метод:

InputStream stream = this.getClass().getClassLoader() 
           .getResourceAsStream("/images/image.jpg"); 

Вы должны изменить путь к изображению по мере необходимости.

Ваш Image код будет выглядеть примерно так:

Image image = Image.getInstance(this.getClass().getResource("/penguin.jpg")); 

Связанные вопрос:

Java Swing Displaying Images From Within-a Jar

+1

+1 - Я помню эту проблему, когда я впервые начал работать с исполняемыми JAR и вышел из Eclipse. Это не сразу очевидно, так что обязательно проверьте это. – JasCav

+0

Aha .. хорошее наблюдение Justin! – CoolBeans

+0

@Cool, спасибо. У меня была эта проблема достаточно времени, чтобы узнать решение. – jjnguy

0

Не зная об ошибке вы получаете, я предполагаю, что это CLASSPATH вопрос. Когда вы запускаете файл jar из командной строки, вам нужно либо передать путь к классу, чтобы указать на зависимые файлы jar, либо на системный путь к классам (переменная среды) должны указывать на все файлы jar, необходимые для запуска вашего приложения.

+0

nope. в его случае, поскольку он использовал экспорт Eclipse в качестве runnable jar, эта информация содержится в манифесте .jar. – djangofan

Смежные вопросы