iTextPDF - 生成的第二个 PDF 文件显示来自第一个生成的 PDF 文件的文本

iTextPDF - Second PDF file generated displays text from First generated PDF file

我正在使用 iTextPDF 生成 PDF,从一些文本输入中获取数据。

当我 运行 应用程序并创建第一个 PDF 时,它会按预期生成。

然后我更改了一些值并生成了另一个值,这就是出现问题的地方。第一个 PDF 上显示的最后一个条目打印在第二个生成的 PDF 的第一个条目之上。

不确定为什么会这样?是保存到缓冲区还是什么的,不太确定。

生成PDF的代码如下:

  public class ExportTicket implements Action{

     PdfPCell titleCell = new PdfPCell();
     PdfPCell contentCell = new PdfPCell();

     public String performAction(HttpServletRequest request) throws PewException {

        // CREATING DOCUMENT (ITEXTPDF)
        Document document = new Document();

        PdfWriter.getInstance(document, new FileOutputStream("Ticket_" + ticketNo + ".pdf"));

        // Fonts
        Font headingFont = new Font(Font.FontFamily.UNDEFINED, 10, Font.BOLD, BaseColor.BLACK);

        // Open Document to Write
        document.open();

        // Table Creation
        PdfPTable table = new PdfPTable(2);
        table.setTotalWidth(200);
        table.setWidths(new int[]{ 5, 10 });
        table.setHorizontalAlignment(Element.ALIGN_LEFT);

        // Add Ticket Number
        contentCell.addElement(new Chunk("Ticket Number: " + ticketNo, headingFont));
        contentCell.setColspan(2);
        table.addCell(contentCell);

        // Add table to Document & Close Document
        document.add(table)
        document.close();
      }
  }

请查看附件的输出图像,第一个显示第一个文件生成,第二个显示第二个文件生成,

第一个生成的票号 PDF 文件:20170034 第二个生成的票号 PDF 文件:20170035

难道是因为你从来没有重置过'contentCell'?

还是重置后的值?

你有奇怪的优先事项。你认为你应该通过只创建一次 PdfPCell 来节省处理时间(尽管你总是需要一个新实例),但是你通过一遍又一遍地创建字体浪费了处理时间(虽然你可以很容易地重新使用它)。

这是您的 class 的改进版本(我假设您从请求中获得了 ticketNo):

public class ExportTicket implements Action{

    // Fonts
    Font headingFont = new Font(Font.FontFamily.UNDEFINED, 10, Font.BOLD, BaseColor.BLACK);

    public String performAction(HttpServletRequest request) throws PewException {
        String ticketNo = request.getParameter("ticketNo");
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream("Ticket_" + ticketNo + ".pdf"));
        // Open Document to Write
        document.open();

        // Table Creation
        PdfPTable table = new PdfPTable(2);
        table.setTotalWidth(200);
        table.setWidths(new int[]{ 5, 10 });
        table.setHorizontalAlignment(Element.ALIGN_LEFT);

        // Add Ticket Number
        PdfPCell contentCell = new PdfPCell()
        contentCell.addElement(new Chunk("Ticket Number: " + ticketNo, headingFont));
        contentCell.setColspan(2);
        table.addCell(contentCell);

        // Add table to Document & Close Document
        document.add(table)
        document.close();
    }
}