【发布时间】:2017-02-27 19:41:52
【问题描述】:
我正在尝试使用谦虚/pdf2json 并且输出非常有用,但我正在尝试计算库使用的度量单位。他们称之为“页面单元”,根据 pdf 规范,这不等于 1/72(点),因为整个页面在高度上有 51 个页面单元
有人知道这个页面单元是什么吗?我在哪里可以找到有关此测量的信息?
非常感谢。
【问题讨论】:
我正在尝试使用谦虚/pdf2json 并且输出非常有用,但我正在尝试计算库使用的度量单位。他们称之为“页面单元”,根据 pdf 规范,这不等于 1/72(点),因为整个页面在高度上有 51 个页面单元
有人知道这个页面单元是什么吗?我在哪里可以找到有关此测量的信息?
非常感谢。
【问题讨论】:
TL;DR 要理解的重要一点是,x、y 和元素宽度/高度是与页面宽度/高度相关的相对单位,其比率可以通过除以现有单位并乘以所需单位来转换为任何目标比率。
下面是无聊的细节:
PDF 没有标准的“尺寸”——您可以打印任何您喜欢的 PDF,包括横向或纵向、不同的页面尺寸(标准、A0-A5、法律、小报、自定义)等。 PDF 的大小以英寸为单位,因此像素的转换(包括 pdf2json)不是@async5 的答案中所示的固定“24px”。
以编程方式获得所需结果的关键是利用已解析的 PDF 信息(页面宽度和页面高度)以及您需要如何呈现它(像素数因显示分辨率的密度而异,但始终为“英寸”一个“英寸”)以及它如何转化为您的目标分辨率。
由于同一物理设备通常支持多种分辨率(更改逻辑 DPI) - 本地像素密度和用户设置的合成密度之间可能存在差异,因此是从 PDF 单元转换为本地显示的基础将是一个比例因子,由 PDF 文件与其物理渲染版本的目标 dpi 之间的差异组成。同样的想法适用于 PDF 解析库,它可能使用与 pdf 文件本身的本机“72dpi”不同的 DPI。
虽然 96dpi 是 Microsoft 的标准尺寸(72dpi 是 Apple 的标准),但无论选择哪一个都不会为您提供正确的像素偏移量 b/c pdf2json 或 pdf.js 对最终用户显示一无所知。对于 pdf2json 坐标 (x/y),它们只是平面上某个位置之间的相对测量值(由宽度/高度定义)。因此标准化为 72dpi 的 8.5"x11" 位置将按如下方式完成:
pdfRect.x = pdfRect.x * ((8.5 * 72) / parsedPdf.formImage.Width);
pdfRect.y = pdfRect.y * ((11 * 72) / parsedPdf.formImage.Pages[0].Height);
无论 pdf2json 的内部 DPI 是什么,或者坦率地说,无论您选择使用什么其他 PDF 解析库,这种公式都可以工作。那是因为它通过除法和使用您需要的任何单位相乘来抵消这些单位。即使今天 pdf2json 在内部使用 96dpi 并缩小 1/4 并随后更改为 72dpi 并缩小 1/2,上述用于转换为像素偏移和 dpi 的数学将独立于该代码更改而工作。
希望这会有所帮助。当我处理这个问题时,互联网似乎缺少了这个的拼写版本。许多人解决特定的具体源/目标解析问题(包括特定于图书馆)或抽象地谈论它但没有很清楚地解释关系。
【讨论】:
pdf2json 生成的任何内容都与 PDF.js 无关(PDF.js 使用标准 PDF space 单元作为基础)
所以基于https://github.com/modesty/pdf2json/blob/3fe724db05659ad12c2c0f1b019530c906ad23de/lib/pdfunit.js:
所以页面单位等于 (96px/inch * 1inch / 4) = 24px。
在您的示例中,高度等于 51 * 24px = 1,224px,或 51 * 0.25inch = 12.72inch
【讨论】: