itext
테이블 : iText 5 대 iText 7
수색…
비고
iText 5 클래스의 PdfPTable
과 PdfPCell
이름은 Table
과 Cell
이라는 클래스를 가지고 있기 때문에 가장 높은 프로그래밍 레벨에서 테이블과 셀 객체를 생성하기 때문에 선택되었습니다. 또한 내부적으로 iText에서 사용할 PdfTable
이라는 클래스가있었습니다. 이러한 클래스에는 많은 결함이 PdfPTable
및 PdfPCell
사용하여 더 이상 사용되지 않습니다. 그들은 오래전에 제거되었습니다.
수년 동안 PdfPTable
과 PdfPCell
은 사용자로부터 몇 가지 비판을 받았습니다. 예를 들어, 사용자는 텍스트 모드 와 합성 모드의 차이를 이해하지 못했습니다.
텍스트 모드 는 PdfPCell
과 같이 PdfPCell
을 만들 때 사용됩니다.
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
이 경우 PdfPCell
레벨에서 수평 정렬과 같은 특성을 정의합니다.
addElement()
메서드를 사용하는 순간 컴포지트 모드 가 시작됩니다.
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
이 경우 PdfPCell
수준에서 정의 된 일부 속성 (예 : 가로 맞춤)은 무시됩니다. 수평 정렬은 셀에 추가 된 요소 레벨에서 정의됩니다. 예를 들어, 다른 단락의 가로 정렬이 다른 셀을 만들려면 복합 모드로 전환하십시오.
iText 5 예제로 만든 표의 스크린 샷을 보면 내용이 Cell 1.1 (텍스트 모드로 추가됨) 및 Cell 1.2 (합성 모드로 추가됨)의 셀 이 완전히 다르게 정렬되어 있음을 알 수 있습니다.
이상한 정렬에 대한 비판에 대한 응답으로, 우리는 ascender와 descender 정보를 사용하는 방법을 도입했습니다. 내용 2.1 (텍스트 모드에서 추가됨) 및 셀 2.2 (합성 모드에서 추가됨)를 가진 셀에 대해이 메소드를 사용합니다. 우리는 또한이 셀들에 5 패딩을 도입했습니다.
이제 결과가 훨씬 좋습니다.
우리가 iText 7에서 수정 한 것 :
iText 7을 처음부터 만들었으므로 재사용 할 수없는 이름을 가진 레거시 클래스가 없었습니다. 우리는 새로운 Table
과 새로운 Cell
클래스를 도입했습니다.
더 이상 텍스트 모드가없고 더 이상 합성 모드가 없습니다. Cell
은 매개 변수없이 또는 rowspan과 colspan을 정의하는 매개 변수를 사용하여 작성됩니다. 모든 내용은 add()
메소드를 사용하여 동일한 방식으로 add()
됩니다.
우리 고객들은 마진과 패딩을 구별하는 방법을 제공 할 것을 요구하고있었습니다. iText 7 예제에서 회색 배경을 추가하여 차이점을 보여줍니다. 콘텐츠 셀 2.1 이있는 셀에서 5 사용자 단위의 여백을 정의합니다. 기본 패딩은 2입니다. 셀 2.2가 있는 셀에서 5 개의 사용자 단위 (0의 기본 여백)의 패딩을 정의합니다.
스크린 샷에서 알 수 있듯이 셀은 매우 멋지게 렌더링됩니다. 우리는 승천 자나 디 센더를 설정하는 메소드를 사용할 필요가 없었습니다. 기본 동작은 개발자가 기대하는 동작에 훨씬 가깝습니다.
iText 7의 테이블과 셀에 대해 더 알고 싶으십니까?
iText 7 : Building Blocks 튜토리얼의 Chapter 5 인 AbstractElement 객체 추가하기 (Part 2) . 무료 전자 책을 받으십시오!
HelloWorldTable.java (iText 5)
이 예에서는 iText 5를 사용하여 다음 표를 만듭니다.
이를 위해 PdfPTable
과 PdfPCell
클래스가 필요합니다 :
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(3);
PdfPCell cell = new PdfPCell(new Phrase("Cell with colspan 3"));
cell.setColspan(3);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
cell.setRowspan(2);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell);
table.addCell("Cell 1.1");
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell 2.1"));
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell();
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
Paragraph p = new Paragraph("Cell 2.2");
p.setAlignment(Element.ALIGN_CENTER);
cell.addElement(p);
table.addCell(cell);
document.add(table);
document.close();
}
HelloWorldTable.java (iText 7)
이 예에서는 iText 7을 사용하여 다음 표를 만듭니다.
이를 위해 Table
및 Cell
클래스가 필요합니다.
public void createPdf(String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
try (Document document = new Document(pdf)) {
Table table = new Table(3);
Cell cell = new Cell(1, 3)
.setTextAlignment(TextAlignment.CENTER)
.add("Cell with colspan 3");
table.addCell(cell);
cell = new Cell(2, 1)
.add("Cell with rowspan 2")
.setVerticalAlignment(VerticalAlignment.MIDDLE);
table.addCell(cell);
table.addCell("Cell 1.1");
table.addCell(new Cell().add("Cell 1.2"));
table.addCell(new Cell()
.add("Cell 2.1")
.setBackgroundColor(Color.LIGHT_GRAY)
.setMargin(5));
table.addCell(new Cell()
.add("Cell 1.2")
.setBackgroundColor(Color.LIGHT_GRAY)
.setPadding(5));
document.add(table);
}
}
출처 : developers.itextpdf.com 및 iText 7 : Building Blocks 튜토리얼.