当前位置: 首页 > 知识库问答 >
问题:

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

何勇
2023-03-14

我使用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();
      }
  }

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

共有2个答案

叶越
2023-03-14

可能是因为您从未重置“contentCell”吗?

或者它是重置的值?

孔鸿宝
2023-03-14

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

这是您的类的改进版本(我假设您从请求中获得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();
    }
}
 类似资料:
  • 我基于thymeleaf模板创建了一个pdf文件,实际上我正在使用模板分解器flying Discer将文件写入输出流,但由于我无法访问前端以定义每次客户端需要时生成的摘要内容,我认为最好在服务器端生成pdf文件。所以我的问题是: 有没有办法获取写入数据的输出流,并将其转换为动态写入,这样就不会在本地存储中创建数据 这是我业务逻辑的一部分: 我在控制器中使用它,在响应实体中使用attachemen

  • 问题内容: 我试图将XML数据从网页转换为PDF文件,希望能完全在JavaScript中完成。我需要能够绘制文本,图像和简单形状。我希望能够完全在浏览器中做到这一点。 问题答案: 示例创建一个“ Hello World” PDF文件。

  • 问题内容: 我一直在构建一个轮询应用程序。人们能够创建他们的民意调查并获取有关他们提出的问题的数据。我想添加功能,以允许用户以PDF的形式下载结果。 例如,我有两个组件负责获取问题和数据。 我正在尝试将两个组件都输出到PDF文件中。然后,用户可以下载该PFD文件。我发现了一些允许在组件内部呈现PDF的软件包。但是,我找不到能从包含虚拟DOM的输入流中生成PDF的文件。如果我想从头开始实现此目标,应

  • 我有两个文件-file1.txt和file2.txt。我想用powershell比较这两个文件,并生成第三个文件(file3.txt),它包含从file1.txt开始的所有行减去file2.txt中的行 你能想出什么办法来做这件事吗?

  • 我正在尝试用Java阅读文本,但效果不好。这是我的密码 但是这样的结果 请稍等... 如果此消息最终未被文档的正确内容替换,则PDF查看器可能无法显示此类文档。 您可以通过访问http://www.adobe.com/go/reader_download.升级到适用于Windows®、Mac或Linux®的最新版本的Adobe Reader 有关Adobe Reader的更多帮助,请访问http:

  • 问题内容: 是否有任何API /解决方案可从XML文件数据和定义生成PDF报告。例如,XML定义/数据可以是: 我觉得将HTML转换为PDF也是一个很好的解决方案。 当前,我们使用iText API编写Java代码。我想外部化代码,以便非技术人员可以编辑和更改。 问题答案: 看看Apache FOP 。使用XSLT样式表将XML(或XHTML)转换为XSL- FO。然后,使用FOP读取XSL-FO