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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:39:01