2017-08-21 26 views
1

iTextPDFを使用して、一部のテキスト入力からデータを取得するPDFを生成しています。iTextPDF - 生成された2番目のPDFファイルが最初に生成されたPDFファイルのテキストを表示

アプリケーションを実行して最初のPDFを作成すると、期待どおりに生成されます。

次に、いくつかの値を変更して別の値を生成します。これが問題の発生場所です。最初のPDFに表示される最後のエントリは、2番目に生成された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 File Generated First 、第1は最初のファイルの生成を表示する2つ目は、第二のファイルの生成を表示し、出力用の添付画像を参照してください最初に生成PDFチケット番号のファイル:20170034 PDF File Generated Second チケット番号のための第2の生成されたPDFファイル:20170035

答えて

2

奇妙な優先順位があります。 PdfPCellを1回だけ作成することで処理時間を節約する必要があると思いますが(新しいインスタンスが常に必要です)、フォントを何度も作成することで処理時間を無駄にします(簡単に再利用できます)。

これはあなたのクラスの改良版(私はあなたが要求から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(); 
    } 
} 
0

'contentCell'をリセットしていない可能性がありますか?

リセットされた値ですか?

+1

はい、私は 'ExportTicket'クラスが再利用されていることを考えると、' contentCell'以来そのセルに追加されたコンテンツが蓄積されます。適合コードについては私の答えを見てください。 –

関連する問題