2013-11-25 5 views
1

두 번째 페이지를 생성 할 때 빈 페이지가 나타납니다. 두 가지 기능이 있습니다. 하나는 텍스트가있는 테이블을 생성하고 다른 하나는 PDF를 생성합니다. 첫 페이지의 끝 부분에 다른 페이지를 추가하면 새 페이지에 쓰기를 원합니다. 내가 생성 된 PDF 파일을 열 때, 두 번째 페이지가 비어 있습니다 :pdfbox 다중 페이지 생성

//global variables 
PDPage nowa=null; 
PDPageContentStream contentStream1 = null; 

//function to generate table 
private void print_sumActionPerformed(java.awt.event.ActionEvent evt){ 
     try { 
      PDDocument doc = null; 
      PDPage page = null; 
      int max_row=55; 
      int suma=0; 
      int pozycja=0; 
      final int starty=760; 
      final int startx=30; 
     try{ 
       doc = new PDDocument(); 
       page = new PDPage(PDPage.PAGE_SIZE_A4); 
       doc.addPage(page); 
       PDFont font = PDType1Font.HELVETICA; 
       PDPageContentStream content = new PDPageContentStream(doc, page,true,true); 
       //some code to generate table 
       drawTable(page, content, starty, startx, content1,doc); 
       content.close(); 
       doc.save("path"); 
       doc.close(); 
       Thread.sleep(500); 
      } catch (Exception e){ 
       System.out.println(e); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(Okno.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (PrinterException ex) { 
      Logger.getLogger(Okno.class.getName()).log(Level.SEVERE, null, ex); 
    } 
}          

기능 그것은 아마 당신의 생성자가 될 수 PDF

private void drawTable(PDPage page, PDPageContentStream contentStream,float y, float margin, String[][] content,PDDocument doc) throws IOException, InterruptedException { 
     final int rows = content.length; 
     final int cols = content[0].length; 
     final float rowHeight = 13f; 
     final float marginCell=5; 
     final float startx=30; 
     final int tableWidth3=200; 
     final int tableWidth5=250; 
     boolean new_kol; 
     if (margin<230){ 
      new_kol=false; 
     }else { 
      new_kol=true; 
     } 
     float textx; 
     final float odst=20; 
     final float starty = y; 
     float texty=starty-rowHeight+3; 
     //width table 
     int tableWidth; 
     if(cols==5)tableWidth=tableWidth5; 
     else tableWidth=tableWidth3; 
     //start print table in pdf 
     if(!new_kol){ 
      contentStream.drawLine(startx,starty,tableWidth+startx+marginCell,starty); 
      textx=startx+marginCell; 
     }else { 
      contentStream.drawLine(startx+tableWidth5+odst, starty, 2*tableWidth5+(startx)+odst+marginCell,starty); 
      textx=startx+marginCell+tableWidth+odst; 
     } 
     for(int i = 0; i < content.length; i++){ 
      for(int j = 0 ; j < content[i].length; j++){ 
       //linia pionowa 
       contentStream.drawLine(textx-marginCell,texty-3,textx-marginCell,texty-3+rowHeight); 
       String text=content[i][j]; 
       if(text.contains("AB")){ 
        contentStream.setFont(PDType1Font.HELVETICA_BOLD,10); 
       }else contentStream.setFont(PDType1Font.HELVETICA,8); 
       contentStream.beginText(); 
       contentStream.moveTextPositionByAmount(textx,texty); 
       contentStream.drawString(text); 
       contentStream.endText(); 
       switch(j){ 
        case 0: textx+=30; 
         break; 
        case 1: 
         if (cols==5) textx += 120; 
         else textx+=150; 
         break; 
        case 2: textx+=15; 
         if(cols==3) contentStream.drawLine(textx+marginCell,texty-3,textx+marginCell,texty-3+rowHeight); 
         break; 
        case 3: textx+=40; 
         break; 
        case 4: textx+=40; 
        contentStream.drawLine(textx+marginCell,texty-3,textx+marginCell,texty-3+rowHeight); 
         break; 
       } 
      } 
      if(new_kol){ 
       textx=tableWidth+startx+odst+marginCell; 
       contentStream.drawLine(textx-marginCell,texty-3,textx+tableWidth,texty-3); 
      } 
      else { 
       textx=startx+marginCell; 
       contentStream.drawLine(textx-marginCell,texty-3,textx+tableWidth,texty-3); 
      } 
      if((texty-=rowHeight)<50){ 
       if(!new_kol){ 
        new_kol=true; 
        contentStream.drawLine(startx,texty+10,startx+tableWidth+marginCell,texty+10); 
        texty=760-10; 
        textx=tableWidth+startx+odst+marginCell; 
        contentStream.drawLine(textx-marginCell,texty+10,textx+tableWidth,texty+10); 
       }else{ 
        new_kol=false; 
        contentStream.drawLine(startx+tableWidth5+odst,texty+10,startx+2*tableWidth,texty+10); 
        texty=760-10; 
        textx=startx+marginCell; 
        //here i add new page when end page height 
        //i get blank page 
        contentStream.close(); 
        page=null; 
        contentStream=null; 
        nowa=new PDPage(PDPage.PAGE_SIZE_A4); 
        page=null; 
        page=nowa; 
        doc.addPage(nowa); 
        PDFont font = PDType1Font.HELVETICA; 
        contentStream1 = new PDPageContentStream(doc, nowa,false,true); 
        contentStream=contentStream1; 
        contentStream1=null; 
        contentStream.drawLine(textx,texty+10,textx+tableWidth,texty+10); 
       } 
      } 
     } 
    } 
+0

'drawTable'에서 마지막으로 생성 된'PDPageContentStream'을 닫지 않습니다. 따라서 PDF의 결과 스트림 객체가 손상 될 수 있습니다. 확인을 위해 샘플 출력 PDF를 제공하십시오. – mkl

+0

감사합니다. 이 대답은 나를 도웁니다. 하지만이 함수를 사용하지 않고 더 많은 페이지를 생성하려면 null 점 예외가 발생합니다. 나는 print_sumActionPerformed (가변 내용)에서 더 쓰고 싶다. 이제는 null 포인터가 있기 때문에 이것이 가능하지 않습니다. 그것을하는 방법? – user3030832

+0

NullPointerException이 발생한 위치를 확인하십시오. 당신은 스택 추적을 가지고 있다고 가정합니다 ... – mkl

답변

1

에 테이블을 생성 할 수 있습니다. 제 생각에는 당신이 사용하는 경우 :

PDPageContentStream content = new PDPageContentStream(doc, page,true,true, false); 

예상대로 작동해야합니다. 마지막 매개 변수는 생성자의 resetContext 값에 해당하며 현재 그래픽 컨텍스트를 재설정해야하는지 여부를 결정합니다 (Source).

관련 문제