2017-10-22 4 views
1

Java에서 iText5를 사용하고 아래 그림과 같이 PdfPcell의 결과를 색으로 구분하고 싶습니다. 이 테이블에는 예를 들어 2 열과 3 행이 있습니다.iText 5 : 텍스트 겹침이있는 배경색 2 개를 포함하는 PdfPcell을 만듭니다.

enter image description here

사람은 어떻게 이러한 목표를 달성하는 아이디어가?

는 단순히

PdfPCell cell = new PdfPCell(new Phrase("60 Pass, 40 Fail", myStyle)); 
cell.setBackgroundColor(new BaseColor(0xff,0x0,0x0)); // red background 

후, 셀에 녹색 사각형을 추가 무엇을, 어떻게 사용하여 배경 색상을 설정할 수 있을까요? 템플릿을 사용 하시겠습니까? 확실하지 않다.

답변

0

셀 이벤트 수신기를 사용하여 "흥미로운"셀 기능을 수행 할 수 있습니다.

예.

public class PercentileCellBackground implements PdfPCellEvent { 
    public PercentileCellBackground(float percent, BaseColor leftColor, BaseColor rightColor) { 
     this.percent = percent; 
     this.leftColor = leftColor; 
     this.rightColor = rightColor; 
    } 

    @Override 
    public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) { 
     PdfContentByte canvas = canvases[PdfPTable.BACKGROUNDCANVAS]; 

     float xTransition = position.getLeft() + (position.getRight() - position.getLeft()) * (percent/100.0f); 
     float yTransition = (position.getTop() + position.getBottom())/2f; 
     float radius = (position.getRight() - position.getLeft()) * 0.025f; 
     PdfShading axial = PdfShading.simpleAxial(canvas.getPdfWriter(), 
       xTransition - radius, yTransition, xTransition + radius, yTransition, leftColor, rightColor); 
     PdfShadingPattern shading = new PdfShadingPattern(axial); 

     canvas.saveState(); 
     canvas.setShadingFill(shading); 
     canvas.rectangle(position.getLeft(), position.getBottom(), position.getWidth(), position.getHeight()); 
     canvas.fill(); 
     canvas.restoreState(); 
    } 

    final float percent; 
    final BaseColor leftColor; 
    final BaseColor rightColor; 
} 

(PercentileCellBackground) 당신은 다음과 같이이 이벤트 리스너 클래스 사용할 수 있습니다

: 귀하의 작업을 위해이 같은 PdfPCellEvent 구현할 수

Document document = new Document(); 
try (OutputStream os = new FileOutputStream(new File(RESULT_FOLDER, "TableWithCellsWithPercentileBackground.pdf"))) { 
    PdfWriter.getInstance(document, os); 
    document.open(); 

    Font font = new Font(FontFamily.UNDEFINED, Font.UNDEFINED, Font.UNDEFINED, BaseColor.WHITE); 
    PdfPTable table = new PdfPTable(2); 
    table.setWidthPercentage(40); 
    PdfPCell cell = new PdfPCell(new Phrase("Group A")); 
    table.addCell(cell); 
    cell = new PdfPCell(new Phrase(new Chunk("60 Pass, 40 Fail", font))); 
    cell.setCellEvent(new PercentileCellBackground(60, BaseColor.GREEN, BaseColor.RED)); 
    table.addCell(cell); 
    cell = new PdfPCell(new Phrase("Group B")); 
    table.addCell(cell); 
    cell = new PdfPCell(new Phrase(new Chunk("70 Pass, 30 Fail", font))); 
    cell.setCellEvent(new PercentileCellBackground(70, BaseColor.GREEN, BaseColor.RED)); 
    table.addCell(cell); 
    cell = new PdfPCell(new Phrase("Group C")); 
    table.addCell(cell); 
    cell = new PdfPCell(new Phrase(new Chunk("50 Pass, 50 Fail", font))); 
    cell.setCellEvent(new PercentileCellBackground(50, BaseColor.GREEN, BaseColor.RED)); 
    table.addCell(cell); 
    document.add(table); 

    document.close(); 
} 

(CellsWithPercentileBackground 테스트를 testCreateTableWithCellsWithPercentileBackground)

결과는 다음과 같습니다 당신이 볼 수 있듯이

Screenshot

, 내가 그린/레드 전환 덜 가혹한 만들기 위해 음영을 사용했다. 좀 더 가혹한 경우 cellLayout 메서드에서 반지름 인수 0.025f을 줄이거 나 대신 사각형 그리기 명령어를 사용하십시오.