使用iText5在Kotlin中为已有PDF添加表格时覆盖原内容的问题
解决iText修改PDF时清空原内容的问题
嘿,作为Java/Kotlin新手遇到这个问题太正常啦!你现在的代码是直接用PdfWriter写入原PDF路径,这相当于新建一个完全空白的PDF覆盖掉了原来的文件,自然看不到之前的内容。要实现保留原PDF内容并在末尾添加表格的需求,得换用PdfReader+PdfStamper的组合来修改已有PDF。
核心思路
- 用
PdfReader读取原PDF的全部内容,确保原内容不会丢失 - 用
PdfStamper在已有PDF的基础上追加新内容,而不是新建文件 - 将表格绘制到原PDF的最后一页(或者新建一页,看你需求)
修改后的代码示例
val pdfPath = intent.getStringExtra("pdfPath") ?: return // 空值判断更安全 try { // 1. 读取原PDF文件 val reader = PdfReader(pdfPath) // 2. 创建PdfStamper,先写入临时文件避免损坏原文件,之后再替换 val tempPdfPath = "${externalCacheDir}/temp_modified.pdf" val stamper = PdfStamper(reader, FileOutputStream(tempPdfPath)) // 3. 获取原PDF的最后一页,准备添加表格 val lastPageNum = reader.numberOfPages val pageSize = reader.getPageSize(lastPageNum) val contentByte = stamper.getOverContent(lastPageNum) // 在原内容上方添加 // 4. 创建你需要的表格(和你原来的逻辑一致) val table = PdfPTable(2) val imgTec = Image.getInstance(StoredPath) var cell = PdfPCell(imgTec) table.addCell(cell) cell = PdfPCell(Phrase("Signature")) cell.border = Rectangle.NO_BORDER table.addCell(cell) // 5. 设置表格位置:以PDF左下角为原点,这里放在页面底部上方50单位,左右留20单位边距 table.totalWidth = pageSize.width - 40f table.writeSelectedRows(0, -1, 20f, 50f, contentByte) // 6. 关闭资源,完成修改 stamper.close() reader.close() // 7. 替换原文件 val originalFile = File(pdfPath) val tempFile = File(tempPdfPath) if (originalFile.exists()) { originalFile.delete() } tempFile.renameTo(originalFile) } catch (e: Exception) { e.printStackTrace() // 这里可以加个Toast提示用户修改失败 }
关键细节说明
- 为什么用临时文件:直接覆盖原文件可能因为文件占用、写入失败导致原PDF损坏,先写临时文件再替换更安全
- 坐标系统:PDF的坐标原点是页面左下角,
writeSelectedRows的参数分别是(起始行,结束行,X坐标,Y坐标,内容流),-1表示写入所有行 getOverContentvsgetUnderContent:前者在原内容上方添加,后者在原内容下方添加,根据你的需求选择
如果想在原PDF后面新建一页添加表格,也可以用stamper.insertPage()方法插入新页面,然后在新页面上添加表格,逻辑类似哦。
内容的提问来源于stack exchange,提问作者Andrea Mangialardo
相关产品推荐
相关产品推荐

