2010-06-02 2 views
1

iText를 사용하여 내 주 PdfP 테이블의 첫 번째 행과 두 번째 행을 함께 유지하는 데 문제가 있습니다. 내 첫 번째 행은 몇 가지 기본 정보가있는 PdfPTable로 구성됩니다. 내 두 번째 행은 모든 테이블 정보를 포함하는 PdfPTable로 구성됩니다. 표 정보가 너무 커지고 여러 페이지에 걸쳐있을 때마다 기본 정보 바로 아래에 표시되고 다음 페이지로 페이징되지 않고 자동으로 두 번째 페이지로 이동합니다. 이 문제를 어떻게 피할 수 있습니까? setSplitRows (false)를 사용하여 시도했지만 빈 문서 만 얻습니다 (주석 된 줄 117 및 170 참조). 첫 페이지에서 어떻게 표의 데이터 (두 번째 행)를 유지할 수 있습니까? 내 코드 예제는 아래에 나와 있습니다 (복사/붙여 넣기 만 가능).iText는 행을 함께 보관할 수 없습니다. 두 번째 행은 여러 페이지에 걸쳐 있지만 첫 행에는 붙지 않습니다.

public class TestHelper{ 
    private TestEventHelper helper; 

    public TestHelper(){ 
     super(); 
     helper = new TestEventHelper(); 
    } 



    public TestEventHelper getHelper() { 
     return helper; 
    } 



    public void setHelper(TestEventHelper helper) { 
     this.helper = helper; 
    } 



    public static void main(String[] args){ 
     TestHelper test = new TestHelper(); 
     TestEventHelper helper = test.getHelper(); 

     FileOutputStream file = null; 
     Document document = null; 
     PdfWriter writer = null; 
     try { 
      file = new FileOutputStream(new File("C://Documents and Settings//All Users//Desktop//pdffile2.pdf")); 
      document = new Document(PageSize.A4.rotate(), 36, 36, 36, 36); 

      writer = PdfWriter.getInstance(document, file); 
//   writer.setPageEvent(templateHelper); 
      writer.setPdfVersion(PdfWriter.PDF_VERSION_1_7); 
      writer.setUserunit(1f); 
      document.open(); 

      List<Element> pages = null; 
      try { 
       pages = helper.createTemplate(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      Iterator<Element> iterator = pages.iterator(); 
      while (iterator.hasNext()) { 
       Element element = iterator.next(); 
       if (element instanceof Phrase) { 
        document.newPage(); 
       } else { 
        document.add(element); 
       } 
      } 

     } catch (Exception de) { 
      de.printStackTrace(); 
//   log.debug("Exception " + de + " " + de.getMessage()); 
     } finally { 
      if (document != null) { 
       document.close(); 
      } 
      if (writer != null) { 
       writer.close(); 
      } 
     } 
     System.out.println("Done!"); 
    } 


private class TestEventHelper extends PdfPageEventHelper{ 

    // The PdfTemplate that contains the total number of pages. 
    protected PdfTemplate total; 
    protected BaseFont helv; 

    private static final float SMALL_MARGIN = 20f; 
    private static final float MARGIN = 36f; 
    private final Font font = new Font(Font.HELVETICA, 12, Font.BOLD); 
    private final Font font2 = new Font(Font.HELVETICA, 10, Font.BOLD); 
    private final Font smallFont = new Font(Font.HELVETICA, 10, Font.NORMAL); 

    private String[] datatableHeaderFields = new String[]{"Header1", "Header2", "Header3", "Header4", "Header5", "Header6", "Header7", "Header8", "Header9"}; 
    public TestEventHelper(){ 
     super(); 
    } 

    public List<Element> createTemplate() throws Exception { 
     List<Element> elementList = new ArrayList<Element>(); 
     float[] tableWidths = new float[]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.25f, 1.25f, 1.25f, 1.25f}; 
//  logger.debug("entering create reports template..."); 

     PdfPTable splitTable = new PdfPTable(1); 
     splitTable.setSplitRows(false); 
     splitTable.setWidthPercentage(100f); 

     PdfPTable pageTable = new PdfPTable(1); 
     pageTable.setKeepTogether(true); 
     pageTable.setWidthPercentage(100f); 

     PdfPTable searchTable = generateSearchFields(); 
     if(searchTable != null){ 
      searchTable.setSpacingAfter(25f); 
     } 

     PdfPTable outlineTable = new PdfPTable(1); 
     outlineTable.setKeepTogether(true); 
     outlineTable.setWidthPercentage(100f); 

     PdfPTable datatable = new PdfPTable(datatableHeaderFields.length); 
     datatable.setKeepTogether(false); 
     datatable.setWidths(tableWidths); 


     generateDatatableHeader(datatable); 

     for(int i = 0; i < 100; i++){ 
      addCell(datatable, String.valueOf(i), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+1), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+2), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+3), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+4), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+5), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+6), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+7), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
      addCell(datatable, String.valueOf(i+8), 1, Rectangle.NO_BORDER, Element.ALIGN_RIGHT, smallFont, true); 
     } 

     PdfPCell dataCell = new PdfPCell(datatable); 
     dataCell.setBorder(Rectangle.BOX); 
     outlineTable.addCell(dataCell); 

     PdfPCell searchCell = new PdfPCell(searchTable); 
     searchCell.setVerticalAlignment(Element.ALIGN_TOP); 

     PdfPCell outlineCell = new PdfPCell(outlineTable); 
     outlineCell.setVerticalAlignment(Element.ALIGN_TOP); 

     addCell(pageTable, searchCell, 1, Rectangle.NO_BORDER, Element.ALIGN_LEFT, null, null); 
     addCell(pageTable, outlineCell, 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, null, null); 

     PdfPCell pageCell = new PdfPCell(pageTable); 
     pageCell.setVerticalAlignment(Element.ALIGN_TOP); 
     addCell(splitTable, pageCell, 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, null, null); 

     elementList.add(pageTable); 
//  elementList.add(splitTable); 

     return elementList; 
    } 

    public void onOpenDocument(PdfWriter writer, Document document) { 
     total = writer.getDirectContent().createTemplate(100, 100); 
     total.setBoundingBox(new Rectangle(-20, -20, 100, 100)); 
     try { 
      helv = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED); 
     } catch (Exception e) { 
      throw new ExceptionConverter(e); 
     } 
    } 

    public void onEndPage(PdfWriter writer, Document document) { 
     //TODO 
    } 

    public void onCloseDocument(PdfWriter writer, Document document) { 
     total.beginText(); 
     total.setFontAndSize(helv, 10); 
     total.setTextMatrix(0, 0); 
     total.showText(String.valueOf(writer.getPageNumber() - 1)); 
     total.endText(); 
    } 

    private PdfPTable generateSearchFields(){ 
     PdfPTable searchTable = new PdfPTable(2); 

     for(int i = 0; i < 6; i++){ 
      addCell(searchTable, "Search Key" +i, 1, Rectangle.NO_BORDER, Element.ALIGN_RIGHT, font2, MARGIN, true); 
      addCell(searchTable, "Search Value +i", 1, Rectangle.NO_BORDER, Element.ALIGN_LEFT, smallFont, null, true); 
     } 
     return searchTable; 
    } 

    private void generateDatatableHeader(PdfPTable datatable) { 
     if (datatableHeaderFields != null && datatableHeaderFields.length != 0) { 
      for (int i = 0; i < datatableHeaderFields.length; i++) { 
       addCell(datatable, datatableHeaderFields[i], 1, Rectangle.BOX, Element.ALIGN_CENTER, font2); 
      } 
     } 
    } 

    private PdfPCell addCell(PdfPTable table, String cellContent, int colspan, int cellBorder, int horizontalAlignment, Font font) { 
     return addCell(table, cellContent, colspan, cellBorder, horizontalAlignment, font, null, null); 
    } 

    private PdfPCell addCell(PdfPTable table, String cellContent, int colspan, int cellBorder, int horizontalAlignment, Font font, Boolean noWrap) { 
     return addCell(table, cellContent, colspan, cellBorder, horizontalAlignment, font, null, noWrap); 
    } 

    private PdfPCell addCell(PdfPTable table, String cellContent, Integer colspan, Integer cellBorder, Integer horizontalAlignment, Font font, Float paddingLeft, Boolean noWrap) { 
     PdfPCell cell = new PdfPCell(new Phrase(cellContent, font)); 
     return addCell(table, cell, colspan, cellBorder, horizontalAlignment, paddingLeft, noWrap); 
    } 

    private PdfPCell addCell(PdfPTable table, PdfPCell cell, int colspan, int cellBorder, int horizontalAlignment, Float paddingLeft, Boolean noWrap) { 
     cell.setColspan(colspan); 
     cell.setBorder(cellBorder); 
     cell.setHorizontalAlignment(horizontalAlignment); 
     if(paddingLeft != null){ 
      cell.setPaddingLeft(paddingLeft); 
     } 
     if(noWrap != null){ 
      cell.setNoWrap(noWrap); 
     } 
     table.addCell(cell); 
     return cell; 
    } 

} 
} 

답변

2

이 문제는 중첩 된 PdfP 테이블을 가지고 있기 때문에 발생합니다. iText는 원하는 방식으로 대형 테이블을 포함하는 단일 셀을 분할 할 수 없습니다. 가장 좋은 방법은 상단에 기본 정보 용으로 1 개, 데이터 용으로 두 번째 개별 테이블을 사용하는 것입니다.

나는 createTemplate()에서 일부 중첩 코드를 주석에 의해 작동하도록 코드를 가지고

public List<Element> createTemplate() throws Exception { 
    List<Element> elementList = new ArrayList<Element>(); 
    float[] tableWidths = new float[]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.25f, 1.25f, 1.25f, 1.25f}; 
    //  logger.debug("entering create reports template..."); 

    PdfPTable splitTable = new PdfPTable(1); 
    splitTable.setSplitRows(false); 
    splitTable.setWidthPercentage(100f); 

    PdfPTable pageTable = new PdfPTable(1); 
    pageTable.setKeepTogether(true); 
    pageTable.setWidthPercentage(100f); 

    PdfPTable searchTable = generateSearchFields(); 
    if(searchTable != null){ 
     searchTable.setSpacingAfter(25f); 
    } 

    PdfPTable outlineTable = new PdfPTable(1); 
    outlineTable.setKeepTogether(true); 
    outlineTable.setWidthPercentage(100f); 

    PdfPTable datatable = new PdfPTable(datatableHeaderFields.length); 
    //  datatable.setKeepTogether(false); 
    datatable.setWidths(tableWidths); 


    generateDatatableHeader(datatable); 

    for(int i = 0; i < 100; i++){ 
     addCell(datatable, String.valueOf(i), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+1), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+2), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+3), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+4), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+5), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+6), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+7), 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, smallFont, true); 
     addCell(datatable, String.valueOf(i+8), 1, Rectangle.NO_BORDER, Element.ALIGN_RIGHT, smallFont, true); 
    } 

    //  PdfPCell dataCell = new PdfPCell(datatable); 
    //  dataCell.setBorder(Rectangle.BOX); 
    //  outlineTable.addCell(dataCell); 
    // 
    //  PdfPCell searchCell = new PdfPCell(searchTable); 
    //  searchCell.setVerticalAlignment(Element.ALIGN_TOP); 
    // 
    //  PdfPCell outlineCell = new PdfPCell(outlineTable); 
    //  outlineCell.setVerticalAlignment(Element.ALIGN_TOP); 
    // 
    //  addCell(pageTable, searchCell, 1, Rectangle.NO_BORDER, Element.ALIGN_LEFT, null, null); 
    //  addCell(pageTable, outlineCell, 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, null, null); 
    // 
    //  PdfPCell pageCell = new PdfPCell(pageTable); 
    //  pageCell.setVerticalAlignment(Element.ALIGN_TOP); 
    //  addCell(splitTable, pageCell, 1, Rectangle.NO_BORDER, Element.ALIGN_CENTER, null, null); 

    elementList.add(searchTable); 
    elementList.add(datatable); 
    //  elementList.add(pageTable); 
    //  elementList.add(splitTable); 

    return elementList; 
}