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();
}
}
我正在使用 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();
}
}
请查看附件的输出图像,第一个显示第一个文件生成,第二个显示第二个文件生成,
难道是因为你从来没有重置过'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();
}
}