如何修改Android代码实现打开PDF指定页面范围而非整个文件
实现仅打开PDF指定页码范围的修改方案
核心注意点
Android系统的PdfRenderer组件页码从0开始计数,如果你要打开物理页码的第5页到第30页,对应索引范围是4到29,需要先按这个规则设置你的目标范围。
关键修改步骤
- 先定义成员变量存储允许的页码范围、当前显示页码、PdfRenderer实例
- 初始化PdfRenderer后先校验PDF总页数是否符合你设置的范围,避免越界崩溃
- 所有页面渲染逻辑都限制在设定的范围内操作
修改后可运行代码
// 先在Activity类顶部定义成员变量 private static final int TARGET_START_PAGE = 4; // 对应物理第5页 private static final int TARGET_END_PAGE = 29; // 对应物理第30页 private int currentPageIndex = TARGET_START_PAGE; private PdfRenderer renderer; private ZoomableImageView touch; // 原有逻辑修改后如下 touch = new ZoomableImageView(Part1Activity.this); linear1.addView(touch); File file = new File(getCacheDir(), "quran_01.pdf"); if (!file.exists()) { try { InputStream asset = getAssets().open("quran_01.pdf"); FileOutputStream output = new FileOutputStream(file); final byte[] buffer = new byte[1024]; int size; while ((size = asset.read(buffer)) != -1) { output.write(buffer, 0, size); } asset.close(); output.close(); } catch (IOException e) { e.printStackTrace(); } } try { renderer = new android.graphics.pdf.PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)); // 先校验PDF总页数是否满足范围要求 int totalPdfPages = renderer.getPageCount(); if (TARGET_END_PAGE >= totalPdfPages || TARGET_START_PAGE < 0) { throw new IllegalArgumentException("设置的页码范围超出PDF总页数范围"); } // 渲染当前允许范围内的页面 renderPage(currentPageIndex); } catch (Exception e){ e.printStackTrace(); } // 抽离单独的页面渲染方法 private void renderPage(int pageIndex) { // 强制限制页码在目标范围内 if (pageIndex < TARGET_START_PAGE || pageIndex > TARGET_END_PAGE) { return; } try { PdfRenderer.Page page = renderer.openPage(pageIndex); Bitmap mBitmap = Bitmap.createBitmap((int)getDip(page.getWidth()), (int)getDip(page.getHeight()), Bitmap.Config.ARGB_8888); page.render(mBitmap, null, null, android.graphics.pdf.PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); touch.setImageBitmap(mBitmap); page.close(); currentPageIndex = pageIndex; } catch (Exception e) { e.printStackTrace(); } } // 如果需要加翻页逻辑,直接调用renderPage即可,示例: // 下一页:renderPage(currentPageIndex + 1) // 上一页:renderPage(currentPageIndex - 1)
额外说明
如果需要动态调整显示范围,只需要修改TARGET_START_PAGE和TARGET_END_PAGE两个常量的值即可,注意要始终按照索引从0开始的规则转换物理页码。
内容的提问来源于stack exchange,提问作者ahmed elagiz
相关产品推荐
相关产品推荐

