如何获取PDF文件中链接的目标页面?

men*_*ith 5 java itext

使用iText我们可以轻松更改链接的缩放级别.甚至还有一段代码可以为GoTo目标类型执行此操作.如需便利,请在下面找到.

PdfReader reader = new PdfReader(src);
        PdfDictionary page = reader.getPageN(11);
        PdfArray annots = page.getAsArray(PdfName.ANNOTS); 
        for (int i = 0; i < annots.size(); i++) {
            PdfDictionary annotation = annots.getAsDict(i);
            if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {
                PdfArray d = annotation.getAsArray(PdfName.DEST);
                if (d != null && d.size() == 5 && PdfName.XYZ.equals(d.getAsName(1)))
                    d.set(4, new PdfNumber(0));
            }
        }
Run Code Online (Sandbox Code Playgroud)

该代码仅处理PDF文件中找到的目标类型之一.我有兴趣在其他类型的目的地中更改缩放(如果有人想知道,它们会在32000-1中列出).具体来说,我想更改每个目的地以GoTo键入并指定我自己的坐标.我希望左坐标与要跳转的页面的页面高度相同.要做到这一点,我显然需要页码.我怎么得到它?

到目前为止我做了什么?该指令PdfArray d = annotation.getAsArray(PdfName.DEST)给出了一个数组,其第一个(0基)元素是页面引用,而不是页面编号,如Bruno Lowagie在他的iText in Action, 2nd edition, p. 202). The array looks like this:[1931 0 R,/ XYZ,0,677,0]中解释的那样.我无法找到正确的命令来获取我自己的页码,因此这篇文章.

mkl*_*mkl 2

我希望左侧坐标与要跳转的页面的页面高度相同。为此,我显然需要页码。我怎样才能得到它?

您需要页码的假设是错误的。是的,实用PdfReader方法主要基于页码工作,但这些方法中没有太多内容。因此,如果您可以进行一些低级数据访问,则不需要页码。

以下是您的代码,其中包含用于检索裁剪框(定义左、下、右和顶部页面坐标)的附加代码,一次直接从目标中的对象引用检索,一次通过页码检索。

PdfReader reader = new PdfReader(src);
PdfDictionary page = reader.getPageN(11);
PdfArray annots = page.getAsArray(PdfName.ANNOTS); 
for (int i = 0; i < annots.size(); i++) {
    PdfDictionary annotation = annots.getAsDict(i);
    if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {
        PdfArray d = annotation.getAsArray(PdfName.DEST);
        if (d == null) {  // in case the link has not a Dest but instead a GoTo action
            PdfDictionary action = annotation.getAsDict(PdfName.A);
            if (action != null)
                d = action.getAsArray(PdfName.D);
        }

        if (d != null && d.size() > 0) {
            System.out.println("Next destination -");
            PdfIndirectReference pageReference = d.getAsIndirectObject(0);

            // Work with target dictionary directly
            PdfDictionary pageDict = d.getAsDict(0);
            PdfArray boxArray = pageDict.getAsArray(PdfName.CROPBOX);
            if (boxArray == null) {
                boxArray = pageDict.getAsArray(PdfName.MEDIABOX);
            }
            Rectangle box = PdfReader.getNormalizedRectangle(boxArray);
            System.out.printf("* Target page object %s has cropbox %s\n", pageReference, box);

            // Work via page number
            for (int pageNr = 1; pageNr <= reader.getNumberOfPages(); pageNr++) {
                PRIndirectReference pp = reader.getPageOrigRef(pageNr);
                if (pp.getGeneration() == pageReference.getGeneration() && pp.getNumber() == pageReference.getNumber()) {
                    System.out.printf("* Target page %s has cropbox %s\n", pageNr, reader.getCropBox(pageNr));
                    break;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

流程链接测试testDetermineTargetPage


顺便说一句,目的地也可以是命名目的地。因此,如果某些 PDF 的Dest值碰巧不是数组而是字符串,您只需在Dests名称树中进行查找即可。