我有一堆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;
}
干杯!
答案 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
。