如何使用java itext保存pdf

时间:2012-11-13 15:40:09

标签: java web-applications pdf-generation itext

我正在为一个课程作业做一个java Web应用程序。在此应用程序中有两种类型的用户:卖方和买方。买家可以购买一套东西,当他这样做时,我必须创建一份pdf格式的收据;但是当我尝试买东西时tomcat给我这个错误:

HTTP Status 500 - \WebApplication\pdf\test.pdf (Impossibile trovare il percorso specificato)

type Exception report

message \WebApplication\pdf\test.pdf (Impossibile trovare il percorso specificato)

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.io.FileNotFoundException: \WebApplication\pdf\test.pdf (Impossibile trovare il percorso specificato)

    java.io.FileOutputStream.open(Native Method)
    java.io.FileOutputStream.<init>(FileOutputStream.java:212)
    java.io.FileOutputStream.<init>(FileOutputStream.java:104)
    viewer.PdfCreator.createPdf(PdfCreator.java:30)
    servlet.BuyerConfirmationPage.doGet(BuyerConfirmationPage.java:115)
    servlet.BuyerConfirmationPage.doPost(BuyerConfirmationPage.java:61)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

这是我写的代码:

try {
            Document document = new Document(PageSize.A4,50,50,50,50);
            PdfWriter.getInstance(document,new FileOutputStream(request.getContextPath() + "/pdf/test.pdf"));
            document.open();
            PdfPTable table = new PdfPTable(5);
            PdfPCell seller_cell = new PdfPCell(new Paragraph("Seller"));
            PdfPCell name_cell = new PdfPCell(new Paragraph("Name"));
            PdfPCell price_cell = new PdfPCell(new Paragraph("Price"));
            PdfPCell UM_cell = new PdfPCell(new Paragraph("UM"));
            PdfPCell quantity_cell = new PdfPCell(new Paragraph("Quantity"));
            table.addCell(seller_cell);
            table.addCell(name_cell);
            table.addCell(price_cell);
            table.addCell(UM_cell);
            table.addCell(quantity_cell);
            PdfPCell seller_cell_value = new PdfPCell(new Paragraph(seller));
            PdfPCell name_cell_value = new PdfPCell(new Paragraph(name));
            PdfPCell price_cell_value = new PdfPCell(new Paragraph(total_price));
            PdfPCell UM_cell_value = new PdfPCell(new Paragraph(UM));
            PdfPCell quantity_cell_value = new PdfPCell(new Paragraph(quantity));
            table.addCell(seller_cell_value);
            table.addCell(name_cell_value);
            table.addCell(price_cell_value);
            table.addCell(UM_cell_value);
            table.addCell(quantity_cell_value);
            document.add(table);
            document.close();


        } catch (DocumentException ex) {
            Logger.getLogger(PdfCreator.class.getName()).log(Level.SEVERE, null, ex);
        }

我确定代码是正确的,并且文件夹存在,为什么我不保存文件?

3 个答案:

答案 0 :(得分:2)

这不是一个iText问题。如果删除所有iText代码并尝试将纯文本写入FileOutputStream,则会出现相同的异常。

Perneel提交的问题是“必须从网上加载PDF”是非常相关的。为什么不在内存中创建PDF而不是将其写入文件?请参阅“iText in Action”中第9章的示例,获取灵感:http://itextpdf.com/book/chapter.php?id=9(阅读本章也会有所帮助)。

在任何情况下:madth3都是正确的:您假设(1)存在\WebApplication\pdf\的路径,以及(2)Web应用程序可以访问此路径。只需使用路径File创建一个"."对象,然后使用getAbsolutePath()将该路径写入servlet的输出。我打赌它不会给你你期望的结果。

答案 1 :(得分:0)

是否有必要从网络上加载pdf?你不能像这样生成一个pdf文件:

Document document = new Document(PageSize.A4,50,50,50,50);
File file = File.createTempFile("dossier_" + selectedDossier.getDossierID() + "_", ".pdf");
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file.getPath()));

答案 2 :(得分:0)

你得到它的上下文路径是URL中使用的相对路径,因此它可能没有指向你想到的地方。我想你应该使用像getRealPath()

这样的东西