如何使用Android PdfViewer(Kotlin)将PDF批注保存到PDF
可行实现方法
方法一:用免费PDF库直接添加原生批注到PDF文件
你当前通过onDraw绘制的批注只是视觉层叠加,并未修改PDF文件结构。建议替换成支持闭源商用的免费PDF库,直接操作PDF添加原生批注,这样生成的PDF能在其他阅读器正常显示批注,且无需付费授权。推荐Apache PDFBox Android版(授权为Apache 2.0,允许闭源商用),步骤如下:
- 引入PDFBox Android依赖到项目中
- 读取原PDF文件,定位到需要添加批注的页面
- 创建文本批注对象,设置内容、位置、样式(颜色、字体等)
- 将批注添加到对应页面后,保存修改后的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:
- 修改现有
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) }
- 使用免费PDF库(如PDFBox或Android自带的
PDFDocument),将保存的Bitmap按原PDF页码顺序添加到新PDF中,完成保存。
注意事项
- 选择PDF库时务必确认授权协议,确保符合你闭源应用的需求,避免法律风险
- 方法一中的PDF坐标系与Android Canvas坐标系不同,需要注意位置转换(PDF原点在页面左下角,Canvas原点在左上角)
内容的提问来源于stack exchange,提问作者Whitt
相关产品推荐
相关产品推荐

