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

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

干杯!

请允许我引用我的书:

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