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

如何使用Android PdfViewer(Kotlin)将PDF批注保存到PDF

可行实现方法

方法一:用免费PDF库直接添加原生批注到PDF文件

你当前通过onDraw绘制的批注只是视觉层叠加,并未修改PDF文件结构。建议替换成支持闭源商用的免费PDF库,直接操作PDF添加原生批注,这样生成的PDF能在其他阅读器正常显示批注,且无需付费授权。推荐Apache PDFBox Android版(授权为Apache 2.0,允许闭源商用),步骤如下:

  1. 引入PDFBox Android依赖到项目中
  2. 读取原PDF文件,定位到需要添加批注的页面
  3. 创建文本批注对象,设置内容、位置、样式(颜色、字体等)
  4. 将批注添加到对应页面后,保存修改后的PDF副本

示例代码逻辑:

// 读取原PDF文件
val pdfDocument = PDDocument.load(inputStream)
// 获取目标页面(PDF页码从0开始,注意与你当前displayedPage的转换)
val targetPage = pdfDocument.getPage(displayedPage - 1)
// 创建文本批注
val textAnnotation = PDAnnotationText()
textAnnotation.setContents("This is a test!")
// 转换坐标:PDF坐标系原点在页面左下角,需对应你Canvas绘制的位置
val pdfX = 50f
val pdfY = targetPage.mediaBox.height - 50f
textAnnotation.setRectangle(PDRectangle(pdfX, pdfY, 200f, 30f))
textAnnotation.setColor(PDColor(Color.RED, PDDeviceRGB.INSTANCE))
// 将批注添加到页面
targetPage.annotations.add(textAnnotation)
// 保存修改后的PDF
pdfDocument.save(outputStream)
pdfDocument.close()

方法二:捕获带批注的页面为图片,重新生成PDF

如果暂时不想替换现有Canvas绘制逻辑,可以先把每个带批注的页面捕获为Bitmap,再用免费PDF库将这些图片拼接成新PDF。缺点是原PDF的矢量信息会丢失,变成纯图片PDF:

  1. 修改现有onLayerDrawn逻辑,完成绘制后捕获画布内容为Bitmap:
override fun onLayerDrawn(canvas: Canvas, pageWidth: Float, pageHeight: Float, displayedPage: Int) {
    val paint = Paint()
    paint.color = Color.RED
    canvas.drawText("This is a test!", 50F, 50F, paint)
    // 捕获当前画布为Bitmap
    val bitmap = Bitmap.createBitmap(canvas.width, canvas.height, Bitmap.Config.ARGB_8888)
    val tempCanvas = Canvas(bitmap)
    tempCanvas.drawCanvas(canvas)
    // 将Bitmap按页码保存到临时存储,后续用于生成PDF
    saveBitmapToTemp(bitmap, displayedPage)
}
  1. 使用免费PDF库(如PDFBox或Android自带的PDFDocument),将保存的Bitmap按原PDF页码顺序添加到新PDF中,完成保存。

注意事项

  • 选择PDF库时务必确认授权协议,确保符合你闭源应用的需求,避免法律风险
  • 方法一中的PDF坐标系与Android Canvas坐标系不同,需要注意位置转换(PDF原点在页面左下角,Canvas原点在左上角)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:10:08