用Java生成PDF

时间:2011-04-18 15:39:14

标签: java pdf io pdf-generation

我正在尝试用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));
        }
    }
}

5 个答案:

答案 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;