Генерация PDF в Java - PullRequest
       2

Генерация PDF в Java

1 голос
/ 18 апреля 2011

Я пытаюсь написать PDF-файл на Java, чтобы сказать слова hello neckbeards, но когда я запускаю программу, открывается Adobe Reader, но появляется сообщение об ошибке:

There was an error opening this document.
The file is already open or in use by another application.

Вот мой код:

import java.awt.Desktop;
import java.io.*;

public class count10 {

    public static void main(String[] args) throws Exception {

        File tempfile = File.createTempFile("report", ".pdf");
        FileWriter pfile = new FileWriter(tempfile);
        pfile.write("hello neckbeards");

        Desktop dtop = null;

        if (Desktop.isDesktopSupported()) {
            dtop = Desktop.getDesktop();
        }
        if (dtop.isSupported(Desktop.Action.OPEN)){
            String path = tempfile.getPath();
            dtop.open(new File(path));
        }
    }
}

Ответы [ 5 ]

5 голосов
/ 18 апреля 2011

Здесь много ошибок:

  • Вы пишете обычный текст .Adobe Reader выдаст ошибку, поскольку файл не является действительным PDF!
    Для записи PDF-файлов используйте библиотеки, такие как iText или PDFBox.

  • Прежде чем вы сможетезаписывая или читая файл, вы открываете соединение из вашей программы с файлом.
    Итак, когда вы заканчиваете запись / чтение файла, не забудьте закрыть соединение чтобы другие программы (например, Adobe Reader) тоже могли читать файл!Чтобы закрыть файл, просто выполните:

    pfile.close();
    
  • Метод main не должен вызывать никаких исключений.Вместо этого, если происходит ошибка, ее необходимо отловить и выполнить соответствующие действия (сообщить пользователю, выйти, ...).Для чтения / записи файлов (или чего-либо еще), это рекомендуемая структура :

    FileReader reader = null;
    try {
        reader = new FileReader("file.txt"); //open the file
    
        //read or write the file
    
    } catch (IOException ex) {
        //warn the user, log the error, ...
    } finally {
        if (reader != null) reader.close(); //always close the file when finished
    }
    
  • Финал if имеет плохо место.Правильный код:

    if (Desktop.isDesktopSupported()) {
        Desktop dtop = Desktop.getDesktop();
        if (dtop.isSupported(Desktop.Action.OPEN)) {
            dtop.open(tempfile);
        }
    }
    

    Также обратите внимание, что я вызываю метод open, передающий файл напрямую .
    Нет необходимости делать его копию.

4 голосов
/ 18 апреля 2011

После того, как вы напишите в свой файл, вы должны закрыть его, используя pfile.close();

Обратите внимание, что вы написали только текстовый файл с содержанием hello neckbeards и расширением .pdf. Это не файл PDF в обычном смысле, который можно открыть с помощью программы чтения PDF, такой как Adobe Reader.

Используйте библиотеку наподобие iText для создания реальных файлов PDF.

Файл должен соответствовать реализации PDF (файл PDF), чтобы быть действительным файлом PDF. Как видите, это гораздо более сложный процесс, чем «просто» запись текста в файл.

4 голосов
/ 18 апреля 2011

Для создания файла PDF вы можете использовать библиотеку, такую ​​как iText .Мне кажется, что вы просто создаете простой текстовый файл, а затем пытаетесь открыть его с помощью программы чтения PDF.

0 голосов
/ 27 декабря 2012
    Try this code....
    Document document=new Document();
    PdfWriter.getInstance(document,new FileOutputStream("E:/data.pdf"));
    document.open();
    PdfPTable table=new PdfPTable(2);
               table.addCell("Employee ID");
               table.addCell("Employee Name");
               table.addCell("1");
               table.addCell("Temperary Employee");
               document.add(table);
               document.close();

You have to import....
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
0 голосов
/ 18 апреля 2011

Я не знаком с открытием файлов с рабочего стола таким образом, но стоит закрыть ваш FileWriter после записи файла. Кстати, я считаю, что XSLT является хорошим способом создания PDF-документов, поскольку вы получаете большой контроль над выводом, а текущее обслуживание и корректировки не требуют повторной компиляции кода (полезно, если у вас есть отдел маркетинга). кто любит менять свое мнение). Посмотрите на XSL-FO, если вам интересно, Apache FOP - хорошая реализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...