如何使用iTextSharp PdfReader从PdfFile获取UserUnit属性

时间:2013-01-29 15:25:06

标签: c# .net pdf itextsharp

我有一堆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;
}

干杯!

1 个答案:

答案 0 :(得分:5)

请允许我引用我的书:

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

  

常见问题 PDF文档中的测量单位是什么?大多数测量   PDF格式以用户空间单位表示。 ISO-32000-1(第8.3.2.3节)告诉我们   “默认用户空间(1/72英寸)中单位大小的默认值为   与点(pt)大致相同,是印刷中广泛使用的单位   行业。它不完全一样;没有普遍定义的观点。“   简而言之,1英寸= 25.4毫米= 72个用户单位(大致相当于72磅)。

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

现在提出您的问题:假设您有一个现有的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