如何从iText 7中的PDF格式的轮廓/书签访问矩形,拟合类型,缩放,页码

时间:2018-02-23 19:12:07

标签: c# pdf itext7

我正在使用iText 7。

我正在尝试使用iText访问PDF书签的(矩形,适合类型,缩放,页码)等属性。

我遵循这个层次结构 - > PdfDocument - > GetOutlines(true) - >这给出了每个书签/大纲。 我已遍历每个书签但我无法访问应包含矩形,适合类型,缩放和页码的视图目标属性。

我知道在创建新书签时我使用过PdfExplicitDestination.CreateXYZ但我无法从pdf文档访问视图目的地。

1 个答案:

答案 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 - 目标语法)