我正在尝试用Java写一个PDF文件来说出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));
}
}
}
答案 0 :(得分:5)
这里有很多错误:
您正在撰写纯文字。 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
方法直接传递文件
没有必要复制它。
答案 1 :(得分:4)
要创建PDF文件,您可以使用iText等库。在我看来,您只是创建一个纯文本文件,然后尝试用PDF阅读器打开它。
答案 2 :(得分:4)
在您写入文件后,您必须使用pfile.close()
;
请注意,您所写的内容只是包含内容hello neckbeards
和扩展名.pdf
的文本文件。正常意义上的不 PDF文件可以使用Adobe Reader等PDF阅读器打开。
使用像iText这样的库来创建真实的PDF文件。
文件必须遵循PDF implementation(PDF文件)才能成为有效的PDF文件。正如您所看到的,这比“只是”将文本写入文件更为复杂。
答案 3 :(得分:0)
我不熟悉以这种方式从桌面打开文件,但是在编写文件后关闭FileWriter是值得的。顺便说一句,我发现XSLT是生成PDF文档的好方法,因为您可以对输出进行大量控制,并且持续维护和调整不涉及重新编译代码(如果您有营销部门,则非常有用)谁喜欢改变他们的想法)。如果您有兴趣,请查看XSL-FO,Apache FOP是一个很好的实现。
答案 4 :(得分:0)
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;