23

我使用PdfRenderer上面的 api 21 在我的应用程序中显示 pdf,我注意到页面的质量很差。我也跟着谷歌示例使用PdfRenderer,这就是我Bitmap为页面创建的方式:

//mCurrentPage is a PdfRenderer.Page and mImageView is an ImageView
Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), 
                    mCurrentPage.getHeight(),
                    Bitmap.Config.ARGB_8888);
mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
mImageView.setImageBitmap(bitmap);

我使用ARGB_8888它是因为据我所知,它是显示位图的最佳质量。难道我做错了什么?

编辑

这是 PdfRenderer 类和经典 Pdf 阅读器之间的巨大差异:

在此处输入图像描述 在此处输入图像描述

4

3 回答 3

55

ARGB_8888` 仅用于颜色质量,但打印/显示质量与分辨率(在屏幕上显示时每英寸有多少点)有关。

例如,如果您有 400 DPI 屏幕(每英寸 400 点)并且想要以这种质量显示 PDF,那么您应该通过将像素作为其大小的 Bitmap.createBitmap() 渲染位图:

Bitmap bitmap = Bitmap.createBitmap(
    getResources().getDisplayMetrics().densityDpi * mCurrentPage.getWidth() / 72,                        
    getResources().getDisplayMetrics().densityDpi * mCurrentPage.getHeight() / 72,
    Bitmap.Config.ARGB_8888
);

在哪里:

  1. getResources().getDisplayMetrics().densityDpi是目标 DPI 分辨率
  2. mCurrentPage.getWidth()返回以 Postscript 点为单位的宽度,其中每个点pt为 1/72 英寸。
  3. 72 (DPI) 是默认的 PDF 分辨率。

因此,将#2 乘以 72 得到英寸,乘以 DPI 得到像素。换句话说,为了匹配显示器打印设备的质量,您应该增加渲染图像的大小,因为默认 PDF 分辨率为 72 DPI。也请检查这个帖子

于 2015-09-01T08:41:47.203 回答
7

我有点晚了。标记的答案对我没有帮助,因为位图变大了,因此无法渲染。我找到了原始帖子,因为我遇到了完全相同的问题,也许这个答案会在我的情况下对其他人有所帮助。

我四处搜寻,看看是否有人有一个巧妙的解决方案来缩放位图,同时保持比例。我遇到了这个网站:

https://guides.codepath.com/android/Working-with-the-ImageView#scaling-a-bitmap

这不是复杂的东西,真的。我只需要另外两行代码:

int height = DeviceDimensionsHelper.getDisplayHeight(this);
Bitmap scaledBitmap = BitmapUtil.scaleToFitHeight(bitmap, height);

我按照网站的建议添加了类似的帮助程序/实用程序类(所以在实践中,它不止两行;))。高度来自

context.getResources().getDisplayMetrics().widthPixels;

缩放只是将设备高度与原始位图高度相除以获得一个因子,然后再乘以原始位图宽度以找到缩放宽度。

这在我的 Nexus 5 上完美运行。我无法在多个设备上进行测试,但它似乎是一个可靠的解决方案。

于 2016-10-02T08:17:53.343 回答
1

PdfRenderer您将在 ImageView 中显示 PDF 页面一样,最简单的方法是简单地创建一个最大尺寸的 ImageView 位图,并添加一些数学来保留 PDF 的比例。由于 PDF 通常用于打印,因此它们的分辨率总是比您的屏幕高,因此您不会冒险获得像素化图像。为确保ImageView已分配measuredWidth并已measuredHeight分配,ImageView::post()请在您的代码中使用(请原谅我的 Kotlin):

    pdfPageImageView.post {
        val viewWidth = pdfPageImageView.measuredWidth
        val viewHeight = pdfPageImageView.measuredHeight
        val pageWidth = page.width
        val pageHeight = page.height
        val pageRatio = 1.0 * pageWidth / pageHeight
        val viewRatio = 1.0 * viewWidth / viewHeight
        val bitmapWidth: Int
        val bitmapHeight: Int
        if (pageRatio > viewRatio) {
            bitmapWidth = viewWidth
            bitmapHeight = (viewWidth / pageRatio).toInt()
        } else {
            bitmapHeight = viewHeight
            bitmapWidth = (viewHeight * pageRatio).toInt()
        }
        val bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888)
        page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
        pdfPageImageView.setImageBitmap(bitmap)
    }
于 2019-06-10T12:22:23.277 回答