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

Sha*_*son 3 .net c# pdf itextsharp

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

将我的PDF文件加载到PdfReader中,我需要做些什么来获取每个页面的UserUnit(显然每个页面的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;
}
Run Code Online (Sandbox Code Playgroud)

干杯!

Bru*_*gie 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.3Page Objects部分中,您将在表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);
Run Code Online (Sandbox Code Playgroud)

大多数情况下,userUnit将是null,但是如果不是,则可以使用userUnit.FloatValue。