首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PdfRenderer在Android上呈现PDF

如何使用PdfRenderer在Android上呈现PDF
EN

Stack Overflow用户
提问于 2016-05-26 14:17:14
回答 1查看 7.9K关注 0票数 2

我在这两种情况下都失败了:

1.试图从电话内存中打开它

2.试图从资产中打开它

我有一个呈现()方法,在第一个例子中,如下所示:

代码语言:javascript
复制
private void render() {
    try {
        imageView = (ImageView) findViewById(R.id.page);

        int REQ_WIDTH = 1;
        int REQ_HEIGHT = 1;
        REQ_WIDTH = imageView.getWidth();
        REQ_HEIGHT = imageView.getHeight();

        Bitmap bitmap = Bitmap.createBitmap(REQ_WIDTH, REQ_HEIGHT, Bitmap.Config.ARGB_4444);

        File file = new File(Environment.getExternalStorageDirectory() + "/Download/test.pdf");

        PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));

        if (currentPage < 0) {
            currentPage = 0;
        } else if (currentPage > renderer.getPageCount()) {
            currentPage = renderer.getPageCount() - 1;
        }

        Matrix matrix = imageView.getImageMatrix();
        Rect rect = new Rect(0, 0, REQ_WIDTH, REQ_HEIGHT);

        renderer.openPage(currentPage).render(bitmap, rect, matrix, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);

        imageView.setImageMatrix(matrix);
        imageView.setImageBitmap(bitmap);
        imageView.invalidate();
        renderer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

抛出的异常就在这里最有趣的部分。如果您想看到完整的日志,单击此处

是的,我在AndroidManifest.xml中增加了所需的权限

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.john.pdfreader">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".BookActivity">
            <intent-filter>
                    <action android:name="com.example.schoolreader.BookActivity" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

让我们看一下第二个案例(阅读资产):

代码语言:javascript
复制
// ...previous code
ParcelFileDescriptor input = getAssets().openFd("test.pdf").getParcelFileDescriptor();
PdfRenderer renderer = new PdfRenderer(input);
// ..previous code

在这个例子中,它是相同的,但是如果我没记错的话,有smth说的是cannot create document,但是现在它已经消失了,异常看起来是一样的。无论如何,我为什么要开始谈论第二个案子呢?有个公开的问题META-INF应该在apk的末尾。我的是在最后,它仍然不起作用。

坦率地说,我甚至尝试过一个来自Androidstudio本身的例子。你知道吗?起作用了!但只有他们的sample.pdf,当我试图用我的替换它时,它只是崩溃。你知道我能在我的Android上做什么pdf渲染吗?

所有的测试都是在Nexus 5,Android6.0 Marshmallow上进行的。

EN

回答 1

Stack Overflow用户

发布于 2016-07-13 13:30:40

除了清单中的权限外,您可能还需要显式地请求权限。类似于:

代码语言:javascript
复制
int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED)
{
    // We don't have permission so prompt the user
    ActivityCompat.requestPermissions(getActivity(), PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37463480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档