3

我有一堆 PDF 文件——我按照要求将这些文件读入字节数组,然后将其传递给 iTextSharp PdfReader 实例。然后我想获取每个页面的尺寸(以像素为单位)。从我目前所读的内容来看,PDF 文件似乎是按点工作的——一个点是一个可配置的单元,存储在名为 UserUnit 的元素中的某种字典中。

将我的 PDF 文件加载到 PdfReader 中,我需要做些什么来获取每个页面的 UserUnit(显然它可能因页面而异),所以我可以获取以像素为单位的页面尺寸。

目前我有这个代码,它以“点”的形式获取每个页面的尺寸——猜想我只需要 UerUnit,然后可以将这些尺寸乘以得到像素或类似的东西。

//Create an object to read the PDF
PdfReader reader = new iTextSharp.text.pdf.PdfReader(file_content);

for (int i = 1; i <= reader.NumberOfPages; i++)
{
  Rectangle dim = reader.GetPageSize(i);
  int[] xy = new int[] { (int)dim.Width, (int)dim.Height };  // returns page size in "points"
  page_data[objectid + '-' + i] = xy;
}

干杯!

4

1 回答 1

5

请允许我引用我的书:

iText in Action - 第二版,第 9 页:

常见问题解答 PDF 文档中的度量单位是什么?PDF 中的大多数度量都以用户空间单位表示。ISO-32000-1(第 8.3.2.3 节)告诉我们“默认用户空间(1/72 英寸)中单位大小的默认值与点 (pt) 大致相同,这是打印中广泛使用的单位行业。不完全相同;一点没有普遍的定义。” 简而言之,1 in. = 25.4 mm = 72 个用户单位(大致相当于 72 pt)。

在下一页中,我解释了可以更改用户单位的默认值,并添加了一个示例,说明如何使用具有不同用户单位的页面创建文档。

现在问你的问题:假设你有一个现有的 PDF,你如何找到使用了哪个用户单元?在回答这个问题之前,我们需要看一下 ISO-32000-1。

在 7.7.3.3 页面对象部分,您将在表 30,“页面对象中的条目”中找到 UserUnit 的描述:

(可选;PDF 1.6)一个正数,应给出默认用户空间单位的大小,以 1⁄72 英寸的倍数表示。支持值的范围应取决于实现。默认值:1.0(用户空间单位为 1⁄72 英寸)。

此密钥在 PDF 1.6 中引入;你不会在旧文件中找到它。它是可选的,因此您不会总是在每页词典中都能找到它。在我的书中,我还解释了 UserUnit 键的最大值是 75,000。

现在如何用 iTextSharp 检索这个值?

您已经拥有Rectangle dim = reader.GetPageSize(i);返回 MediaBox。这可能不是页面可视部分的大小。如果为页面定义了 CropBox,查看器将显示比您所拥有的要小得多的尺寸xy(但您可能已经知道这一点)。

您现在需要的是页面字典,以便您可以检索 UserUnit 键的值:

PdfDictionary pageDict = reader.GetPageN(i);
PdfNumber userUnit = pageDict.GetAsNumber(PdfName.USERUNIT);

大多数时候 userUnit 将是null,但如果不是,您可以使用userUnit.FloatValue.

于 2013-01-29T17:26:32.367 回答