Создание PDF в Java

#java #pdf #io #pdf-generation

#java #PDF #io #pdf-генерация

Вопрос:

Я пытаюсь записать 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));
        }
    }
}
  

Комментарии:

1. Как упомянули несколько человек ниже, iText — отличный способ создания PDF-файлов. Пожалуйста, ознакомьтесь с лицензией iText перед любой серьезной разработкой.

2. Вау. Это случайно не домашнее задание, не так ли?

3. @neckbeard69 1) Если это домашнее задание, пожалуйста, отметьте его homework тегом. 2) Когда вы нашли ответ, который решает вашу проблему, пожалуйста, примите его, поставив зеленую галочку рядом с областью голосования. Спасибо!

Ответ №1:

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

  • Вы пишете обычный текст. 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 метод, передающий файл напрямую.
    Нет необходимости создавать его копию.

Ответ №2:

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

Ответ №3:

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

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

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

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

Ответ №4:

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

Ответ №5:

     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;