在绘制到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上绘制图像作为实际大小,而不会出现这些缩放/大小问题。
答案 0 :(得分:2)
这是一个较晚的答案,但是a已经处理了相同的问题,并找到了解决方法,并附带了解释。
说明:
PdfDocument。页面大小单位,后记点为1/72英寸。
这意味着,PdfDocument在物理打印时使用的点的尺寸为1/72英寸,这等于在打印的文档中1英寸中有72个点。这也称为72 DPI(Dots Per Inch)。
因此,使用72 DPI,如果您想以与打印文档相同的尺寸(没有放大倍数)在屏幕上查看文档,则每英寸需要72像素(PPI)< / p>
与图片不同,PDF文件具有实际大小,因此PdfDocument.Page的Canvas可以理解为打印文档的“屏幕”。对于要表示为原始内容的内容,此“屏幕”的密度必须为72 PPI。
解决方案:
不需要logo.setDensity(DisplayMetrics.DENSITY_XHIGH);
,因为您不想更改图像的比例,需要指定画布的密度。
解决方案是canvas.setDensity(72);
答案 1 :(得分:1)
根据要求,我发现的解决方案是将密度设置为高于应有的值。 将位图密度设置为 DENSITY_XHIGH 而不是 DENSITY_HIGH 可以为我提供相当大的渲染位图。位图更接近于生成pdf时的预期尺寸。
答案 2 :(得分:0)
[我将你的解决方案复制到答案中。如果您找到了解决方案,请自行创建答案并接受]
我尝试将位图密度设置为高于我认为的值:$when
这就是诀窍。 (我最初将它设置为DENSITY_HIGH,但它仍然略微缩放图像,因此将其更改为logo.setDensity(DisplayMetrics.DENSITY_XHIGH);
。)
答案 3 :(得分:0)
确切的解决方案是设置画布&#39;密度为72(但为什么?)
logo.setDensity(dpi);
(以pt和位图大小从所需图像尺寸计算dpi)canvas.setDensity(72);
canvas.drawBitmap(logo, ....);