当前位置: 首页 > 知识库问答 >
问题:

如何在PDF文件中获得链接的目的页?

郎睿
2023-03-14

使用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));
            }
        }

代码只处理PDF文件中的目标类型之一。我对改变其他类型的目的地的缩放感兴趣(如果有人想知道的话,它们列在32000-1中)。具体地说,我希望将每个目的地更改为goto类型,并指定自己的坐标。我想左坐标与页面高度相同的页面跳转。要做到这一点,我显然需要页码。我怎么弄?

到目前为止我做了什么?指令pdfarray d=annotation.getasarray(pdfname.dest)给su一个数组,其中第一个(基于0的)元素是页面引用,而不是页码,正如Bruno Lowagie在他的iText in Action,第2版,p中所解释的那样。202)。数组如下所示:[1931 0R,/xyz,0,677,0]`。我无法找到正确的命令来获取页码,因此我发了这篇文章。

共有1个答案

段宏毅
2023-03-14

我想左坐标与页面高度相同的页面跳转。要做到这一点,我显然需要页码。我怎么弄?

你需要页码的假设是错误的。pdfreader实用工具方法大多基于页码工作,是的,但这些方法中没有太多。如果您可以进行一些低级别的数据访问,那么您就不需要页码了。

下面是检索cropbox(定义左、下、右和顶部页面坐标)的附加代码,一次是直接从目标中的对象引用检索,一次是通过页码检索。

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;
                }
            }
        }
    }
}

(ProcessLink测试TestDetermineTargetPage)

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

 类似资料:
  • 问题内容: 我在网页上提供了pdf文件的链接以供下载,如下所示 问题是,当用户单击此链接时, 如果用户已安装Adobe Acrobat,则它将在Adobe Reader的同一浏览器窗口中打开文件。 如果未安装Adobe Acrobat,则弹出窗口提示用户下载文件。 但是,无论是否安装了“ Adob​​e acrobat”,我都希望它始终弹出用户下载。 请告诉我我该怎么做? 问题答案: 而不是链接到

  • 我正试图在我的vue应用程序上创建一个链接到本地pdf文件。现在我的问题是。 我的PDF文件位于assets/static/中,并且现在像这样链接到它们。

  • 我是Django 1.9.5的新手,使用windows作为我的平台。我有一个问题连接我的css,图像和js到django templage, 这是我的项目结构 这是我的设置页面 这是我的主要网址。py页 这是我的基本html模板 Github链接我在Github中的项目我尝试了所有可能的组合,但在2天内失败了。任何帮助都会被占用,我会感谢你的

  • 1. 多目标文件的链接 现在我们把例 12.1 “用堆栈实现倒序打印”拆成两个程序文件,stack.c实现堆栈,而main.c使用堆栈: /* stack.c */ char stack[512]; int top = -1; void push(char c) { stack[++top] = c; } char pop(void) { return stack[top--]; } i

  • 问题内容: 我有一个Java项目,我想开发它而不替换源代码。我想将代码链接到我的工作空间而不进行物理替换吗? 问题答案: 从中选择您要引用的 右键单击并转到(或按Ctrl-Enter)。 在中,您可以添加当前打开的另一个项目。 如果您要覆盖某个类,则可以在当前项目中对其进行复制,然后将其移至中的类路径中。

  • 问题内容: 我想在Linux中建立一个符号链接。我已经编写了此Bash命令,其中第一个路径是我要链接到的文件夹,第二个路径是已编译的源代码。 它是否正确? 问题答案: 要创建新的符号链接(如果符号链接已存在,将失败): 要创建或更新符号链接: