【问题标题】:Android: PDF created using PrintedPdfDocument looks different on different devicesAndroid:使用 PrintedPdfDocument 创建的 PDF 在不同设备上看起来不同
【发布时间】:2020-11-24 10:26:16
【问题描述】:

我正在尝试将视图呈现给 PrintedPdfDocument。正如预期的那样,页面的大小以 1/72 英寸为单位。因此,对于 A0 大小的页面(宽度 = 33.11 英寸),document.getPageWidth() 返回 2384 (33.11 * 72)。页面画布宽度等于 1 个像素等于 1/72 英寸单位 - 因此,pageCanvas.getWidth() 返回 2384。这在不同的设备上是正确的。到目前为止一切顺利。

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

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

鉴于数字上的 document.getPageWidth() 以 1/72 英寸为单位 == pageCanvas.getWidth() 以像素为单位,pageCanvas.getDensity() 不应该总是 72 DPI 吗?在某些手机上为 320(正确显示的位置),而在其他手机上为 420(视图被拉伸的位置)。

这里有点卡住,所以非常感谢任何指针。提前致谢!

【问题讨论】:

  • 这是一个非常详细的描述,可能就足够了,但minimal reproducible example 永远不会受到伤害。
  • 感谢瑞恩。这种行为实际上没有可变性——这在 100% 的时间内是可重现的。无论如何,我找到了我自己问题的答案 - 将在下面发布:)

标签: android pdf-generation android-canvas pixel-density android-pdf-api


【解决方案1】:

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

我还是不明白为什么pageCanvas.getDensity()设置为显示密度而不是PDF页面的密度(72dpi)。我的猜测是,这可能是因为某些视图在绘制到画布时可能会错误地使用屏幕的显示指标,即使画布不是屏幕 - 但这只是我的猜测。

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

这是完美的工作,创建的 PDF 页面现在看起来相同,无论创建它的设备是什么。唯一的副作用是 Adob​​e Acrobat 认为页面是 33.11 * 420 / 72 英寸宽,而不是 33.11 英寸宽。但这实际上并不重要,因为我们可以在打印时缩小页面以适应 A0 纸。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多