我在将内容绘制到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画布密度 = 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大小单位,即每英寸72点的Postscript点。因此,160个Postscript点相当于2.2英寸〜原始图像的两倍大小(1 x 1英寸)。
如果我把图像的大小减半,那么就会出现像素化,因为实际上是将一个0.5 x 0.5英寸的图像绘制到1 x 1英寸的空间中。
我想知道如何在PdfDocument.Page上以实际大小绘制图像,而不会出现这些缩放/大小问题。
logo.setDensity(DisplayMetrics.DENSITY_XHIGH);
这样做可以解决问题。 我最初将其设置为 DENSITY_HIGH,但仍然稍微缩放了图像,因此将其更改为 DENSITY_XHIGH。 现在看起来好多了。 谢谢 @shadowbrush - Glenster