我正在使用iText 7。
我正在尝试使用iText访问PDF书签的(矩形,适合类型,缩放,页码)等属性。
我遵循这个层次结构 - > PdfDocument
- > GetOutlines(true)
- >这给出了每个书签/大纲。
我已遍历每个书签但我无法访问应包含矩形,适合类型,缩放和页码的视图目标属性。
我知道在创建新书签时我使用过PdfExplicitDestination.CreateXYZ
但我无法从pdf文档访问视图目的地。
答案 0 :(得分:0)
您可以从PdfDestination
检索的数据主要是非常原始的PDF。因此,目标不是您想要的格式,而是名称,字节字符串或数组。前两个选项是命名目标,即您必须在 Dests 名称树中查找目标数组。
IDictionary<String, PdfObject> names = document.GetCatalog().GetNameTree(PdfName.Dests).GetNames();
[...]
if ([... some PdfOutline instance ...].GetDestination() is PdfDestination destination)
{
PdfObject destObject = destination.GetPdfObject();
if (destObject is PdfString str)
{
destObject = names[str.ToUnicodeString()];
}
else if (destObject is PdfName nam)
{
destObject = names[nam.GetValue()];
}
现在你应该有PdfArray
并且可以检查它的值。页面字典是其中的第一个对象,所以
if (destObject is PdfArray arr)
{
if (arr.Get(0) is PdfDictionary pageDict)
{
int pageNumber = document.GetPageNumber(pageDict);
[...]
}
[... inspect remaining array entries ...]
}
}
在检查剩余的数组条目时,实际上有许多可能的数组形式需要考虑:
[页面 / XYZ 左上角缩放] 显示页面指定的页面,坐标(左,顶部)位于窗口的左上角,页面内容由因子缩放放大。任何参数 left,top,或 zoom 的空值指定该参数的当前值应保持不变。 zoom 值为0,其含义与空值相同。
[页面 / Fit] 显示页面指定的页面,其内容放大到足以在窗口内水平和垂直适合整个页面。如果所需的水平和垂直放大系数不同,请使用两者中较小的一个,将窗口中的页面居中放在另一个维度中。
[页面 / FitH 顶部] 显示 page 指定的页面,垂直坐标 top 位于窗口的上边缘,页面内容放大到足以适合整个宽度窗口内的页面。 top 的空值指定该参数的当前值应保持不变。
[页面 / FitV 左] 显示 page 指定的页面,水平坐标 left 位于窗口的左边缘,页面内容放大到足以适合整个高度窗口内的页面。 left 的空值指定该参数的当前值应保持不变。
[页 / FitR 左下方右上方] 显示 page 指定的页面,其内容放大到足以适合坐标 left,bottom,right,和 top 指定的矩形完全在窗户内水平和垂直。如果所需的水平和垂直放大系数不同,请使用两者中较小的一个,将窗口中的矩形居中放在另一个维度中。
[ page / FitB] (PDF 1.1)显示页面指定的页面,其内容放大到足以在窗口内完全适合水平和垂直方向的边界框。如果所需的水平和垂直放大系数不同,请使用两者中较小的一个,将窗口中的边界框居中放在另一个维度中。
[页面 / FitBH 顶部] (PDF 1.1)显示页面指定的页面,垂直坐标 top 位于窗口的上边缘,页面内容放大到足以适合窗口内其边界框的整个宽度。 top 的空值指定该参数的当前值应保持不变。
[页面 / FitBV 左] (PDF 1.1)显示页面指定的页面,水平坐标 left 位于窗口的左边缘,页面内容放大到足以适合窗口内边界框的整个高度。 left 的空值指定该参数的当前值应保持不变。
(ISO 32000-2,表149 - 目标语法)