Android 安卓:使用PrintedPdfDocument创建的PDF在不同的设备上看起来不同

Android 安卓:使用PrintedPdfDocument创建的PDF在不同的设备上看起来不同,android,pdf-generation,android-canvas,pixel-density,android-pdf-api,Android,Pdf Generation,Android Canvas,Pixel Density,Android Pdf Api,我正在尝试将视图渲染到打印的PDF文档。页面的大小如预期的一样,以1/72英寸为单位。因此,对于A0大小的页面(宽度=33.11英寸),document.getPageWidth()返回2384(33.11*72)。页面画布宽度等于一个像素等于一英寸单位的1/72,因此,pageCanvas.getWidth()返回2384。在不同的设备上也是如此。到目前为止还不错 我面临的问题是,在不同的设备上,为同一视图生成的PDF文档看起来不同。在某些设备上,它会在PDF页面上拉伸,在某些设备上,它会按原

我正在尝试将视图渲染到打印的PDF文档。页面的大小如预期的一样,以1/72英寸为单位。因此,对于A0大小的页面(宽度=33.11英寸),
document.getPageWidth()
返回2384(33.11*72)。页面画布宽度等于一个像素等于一英寸单位的1/72,因此,
pageCanvas.getWidth()
返回2384。在不同的设备上也是如此。到目前为止还不错

我面临的问题是,在不同的设备上,为同一视图生成的PDF文档看起来不同。在某些设备上,它会在PDF页面上拉伸,在某些设备上,它会按原样呈现

这里可能有什么问题?PDF的生成不是应该独立于设备吗?我注意到
pageCanvas.getDensity()
在不同的手机上是不同的。为什么手机屏幕密度会影响PDF页面画布的密度

假设以1/72英寸为单位的
document.getPageWidth()
==
pageCanvas.getWidth()
以像素为单位,那么
pageCanvas.getDensity()
不应该总是72 DPI吗?在一些手机上是320(正确显示),而在另一些手机上是420(渲染拉伸视图)


这里有点卡住了,所以我真的很感谢你的指点。提前谢谢

我找到了解决这个问题的方法

我仍然不知道为什么将
pageCanvas.getDensity()
设置为显示密度,而不是PDF页面的密度(72dpi)。我的猜测是,这可能是因为某些视图在绘制画布时可能错误地使用屏幕的显示度量,即使画布不是屏幕,但这只是我的猜测

不管为什么
pageCanvas.getDensity()
被设置为屏幕密度,我解决这个问题的方法是使用屏幕密度计算页面维度(以dp为单位)。因此,如果我想绘制A0页面(33.11英寸宽),我将页面宽度(在创建
PrintedPdfDocument
时)设置为33.11*420=13906 dp,而不是建议的33.11*72=2384 dp。这样,当视图绘制到密度为420 dpi的画布上时,生成的页面宽度为所需的33.11英寸


这是完美的工作,创建的PDF页面现在看起来是一样的,不管它是在哪里创建的设备。唯一的副作用是Adobe Acrobat认为页面的宽度是33.11*420/72英寸,而不是33.11英寸。但这实际上并不重要,因为我们可以在打印时缩小页面以适合A0纸张。

这是一个非常详细的描述,可能已经足够了,但这是一个永远不会伤害的描述。谢谢Ryan。在这种行为中确实没有可变性——这是100%可重复的。无论如何,我找到了我自己问题的答案——将在下面发布:)