在绘制到PdfDocument.Page时,我遇到了图像变大的问题。该应用针对运行Android 4.4.4(API级别19)的设备。
我正在生成pdf文档并添加如下图像:
PdfDocument document = new PdfDocument();
//Create an A4 sized page 595 x 842 in Postscript points.
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
Bitmap logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.pdf_logo);
Log.i(Consts.LOG_TAG, "pdf canvas density = " + canvas.getDensity());
Log.i(Consts.LOG_TAG, "pdf UOD logo density = " + logo.getDensity());
canvas.drawBitmap(logo, 50, 50, null);
document.finishPage(page);
/*
document is written out to a FileOuputStream().
Details omitted.
*/
文档写得正确,我使用Canvas.drawText()方法呈现的其他文本看起来很好。 但是,在pdf文档中绘制的图像总是太大。
我检查过图像和画布的密度都是一样的。图像(pdf_logo.jpg)是: - 160 dpi - 分辨率为160 x 160的物理像素。 - 所以尺寸为1英寸x 1英寸。
上面代码中的日志也返回以下内容:
04-22 11:55:50.607:I / App(7856):pdf canvas density = 160 04-22 11:55:50.607:I / App(7856):pdf UOD标识密度= 160
这表明图像dpi也与Canvas密度匹配。但是,当图像被绘制到pdf文档上时,图像远大于1英寸x 1英寸。它的尺寸大约是2英寸x 2英寸的两倍。
我怀疑是Android使用了图像的物理分辨率(160 x 160)并将其转换为PdfDocument.Page大小单位,Postscript点为1/72英寸。所以160个Postscript点相当于2.2英寸〜原始图像尺寸的两倍(1 x 1英寸)。
如果我将图像的大小减半,那么我会得到像素化,因为它将有效地将0.5 x 0.5英寸的图像绘制到1 x 1英寸的空间中。
我想知道如何在PdfDocument.Page上绘制图像作为实际大小,而不会出现这些缩放/大小问题。
根据要求,我发现的解决方案是将密度设置为高于应有的值。将位图密度设置为DENSITY_XHIGH而不是DENSITY_HIGH可以为我提供相当大的渲染位图。位图更接近生成pdf时的预期大小。
[我将你的解决方案复制到答案中。如果您找到了解决方案请创建答案并自己接受]
我已经尝试将位图密度设置为高于我认为应该是的值:logo.setDensity(DisplayMetrics.DENSITY_XHIGH);
这就是诀窍。 (我最初将它设置为DENSITY_HIGH,但它仍然略微缩放图像,因此将其更改为DENSITY_XHIGH
。)
确切的解决方案是将Canvas的密度设置为72(但为什么?)
logo.setDensity(dpi);
(从pt和位图大小的所需图像尺寸计算dpi)canvas.setDensity(72);
canvas.drawBitmap(logo, ....);