You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用iText5在Kotlin中为已有PDF添加表格时覆盖原内容的问题

解决iText修改PDF时清空原内容的问题

嘿,作为Java/Kotlin新手遇到这个问题太正常啦!你现在的代码是直接用PdfWriter写入原PDF路径,这相当于新建一个完全空白的PDF覆盖掉了原来的文件,自然看不到之前的内容。要实现保留原PDF内容并在末尾添加表格的需求,得换用PdfReader+PdfStamper的组合来修改已有PDF。

核心思路

  1. 用PdfReader读取原PDF的全部内容,确保原内容不会丢失
  2. 用PdfStamper在已有PDF的基础上追加新内容,而不是新建文件
  3. 将表格绘制到原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表示写入所有行
  • getOverContent vs getUnderContent:前者在原内容上方添加,后者在原内容下方添加,根据你的需求选择

如果想在原PDF后面新建一页添加表格,也可以用stamper.insertPage()方法插入新页面,然后在新页面上添加表格,逻辑类似哦。

内容的提问来源于stack exchange,提问作者Andrea Mangialardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:02:43