Itext7 Java迁移:如何替代Itext5的表格内容定位实现?
问题
在iText5中,我们通常用以下代码片段设置表格内容的位置:
public static void writeContentInTable(PdfWriter writer, PdfPTable pTable, int xPos, int yPos) { try { pTable.writeSelectedRows(0, -1, xPos, yPos, writer.getDirectContent()); } catch(Exception e) { //Logging Errors } }
现在将代码从iText5迁移至iText7时,难以实现相同的表格内容定位功能。能否提供实现方案?是否可通过以下类完成:
com.itextpdf.layout.element.Table; com.itextpdf.kernel.pdf.PdfWriter;
解决方案
完全可以用你提到的com.itextpdf.layout.element.Table和com.itextpdf.kernel.pdf.PdfWriter类实现定位。iText7的布局体系与iText5不同,需要借助Canvas类直接在指定坐标绘制表格,具体实现如下:
核心逻辑:通过
Canvas绑定PDF的直接内容对象,在Canvas上指定位置添加Table。iText7移除了writeSelectedRows方法,转而用Canvas的布局能力实现精准定位。代码示例:
import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.layout.Canvas; import com.itextpdf.layout.element.Table; import com.itextpdf.kernel.geom.Rectangle; public static void writeContentInTable(PdfWriter writer, Table table, float xPos, float yPos) { try { PdfDocument pdfDoc = new PdfDocument(writer); // 创建Canvas,指定表格的定位坐标及尺寸 Rectangle tableArea = new Rectangle(xPos, yPos, table.getWidth(), table.getHeight()); Canvas canvas = new Canvas(writer.getDirectContent(), pdfDoc, tableArea); // 将表格添加到Canvas,此时表格左上角对齐(xPos, yPos) canvas.add(table); canvas.close(); } catch (Exception e) { // 错误日志记录 e.printStackTrace(); } }
- 关键说明:
- iText7的坐标系原点在页面左下角,
Rectangle的x、y参数对应表格左上角的位置 - 调用
table.getWidth()和table.getHeight()前,需确保表格已完成布局计算,必要时可先将表格临时添加到空白文档触发度量 - 若需定位到特定页面,需先获取目标
PdfPage,再创建Canvas时传入该页面的内容对象
内容的提问来源于stack exchange,提问作者Kishore Kumar Korada
相关产品推荐
相关产品推荐

