#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;