使用Intent分享生成的PdfDocument时出现最后一页重复的问题
使用Intent分享生成的PdfDocument时出现最后一页重复的问题
嘿,我之前也踩过这个坑!用Android的PdfDocument生成带批注的PDF然后分享,结果最后一页总是莫名其妙重复,折腾了好一阵才摸清楚原因,给你分享下我总结的解决思路:
最常见的原因:页面绘制逻辑的重复调用
这大概率是你在生成PDF时,页面的startPage()、绘制操作、finishPage()没有一一对应。比如循环处理每页时,最后一次循环结束后又额外执行了一遍最后一页的绘制代码,或者循环条件写错导致多跑了一次。
- 检查你的页面循环逻辑,确保每个页面的生命周期是完整的:打开页面→绘制内容→结束页面,三者严格对应,不要在循环外重复处理最后一页。
第二个坑:文件流未正确关闭/刷新
PdfDocument生成的内容需要写入文件流,如果流没处理好,很可能会导致最后一页的数据被重复写入。
- 生成PDF后,一定要按正确顺序关闭资源:先调用
pdfDocument.close(),再flush并关闭输出流(比如FileOutputStream),然后再去创建分享Intent。示例代码如下:
val outputStream = FileOutputStream(outputFile) pdfDocument.writeTo(outputStream) // 先关闭PdfDocument,确保所有页面数据都写入流 pdfDocument.close() // 刷新并关闭输出流,避免残留数据重复写入 outputStream.flush() outputStream.close()
还有一种可能:原PDF页面读取重复
如果你是基于原PDF页面绘制批注,那要检查读取原PDF页面的逻辑是否正确。比如用PdfRenderer时,页面索引是不是从0到pageCount-1,别因为循环条件写错(比如<= pageCount)导致最后一页被读取两次,进而生成重复页面。
给你一个完整的参考片段
// 假设你已经获取了原PDF的页面数量、尺寸,以及每页的批注数据 val pdfDocument = PdfDocument() val originalPageCount = 5 // 示例:原PDF有5页 for (pageIndex in 0 until originalPageCount) { // 创建页面信息,页码从1开始 val pageInfo = PdfDocument.PageInfo.Builder(pageWidth, pageHeight, pageIndex + 1).create() // 开启新页面 val page = pdfDocument.startPage(pageInfo) val canvas = page.canvas // 绘制原PDF页面内容(这里替换成你实际的绘制逻辑) drawOriginalPdfPage(canvas, pageIndex) // 绘制当前页的批注 drawPageAnnotations(canvas, pageIndex) // 必须在循环内结束当前页,不能遗漏 pdfDocument.finishPage(page) } // 写入文件并关闭资源 val outputFile = File(context.filesDir, "annotated_share.pdf") val outputStream = FileOutputStream(outputFile) pdfDocument.writeTo(outputStream) pdfDocument.close() outputStream.flush() outputStream.close() // 创建分享Intent val shareIntent = Intent(Intent.ACTION_SEND) shareIntent.type = "application/pdf" // 注意用FileProvider获取Uri,适配Android 7.0+ val pdfUri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", outputFile) shareIntent.putExtra(Intent.EXTRA_STREAM, pdfUri) shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) context.startActivity(Intent.createChooser(shareIntent, "分享带批注的PDF"))
最后建议你先把生成的PDF保存到本地,打开看看是否已经重复——如果本地文件就重复,那问题肯定出在PDF生成逻辑上,和分享Intent无关;如果本地文件正常,再去排查Intent的Uri权限或文件读取问题。
备注:内容来源于stack exchange,提问作者Calvin Godfrey
相关产品推荐
相关产品推荐

