Java使用itext在现有pdf中设置本地文件Hyperlink

时间:2013-08-05 07:36:38

标签: java pdf hyperlink itext

我正在尝试在现有PDF中提供超链接,单击该链接时将打开该文件。怎么办呢?

我尝试使用代码,它可以正常用于外部超链接,例如 http://www.google.com ,但不适用于本地文件超链接,例如 D:/intro.pdf

我正在使用 itext pdf库。

代码:

        String in = "D:/introduction.pdf";
        String out = "D:/introduction.pdf";

        try {
            PdfReader reader = new PdfReader(in);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfStamper stamper = new PdfStamper(reader, baos);


            PdfContentByte canvas=stamper.getOverContent(6);
            Chunk imdb = new Chunk("Local Link");
            imdb.setAnchor("http://www.google.com"); // this work
         // imdb.setAnchor("D://intro.pdf");  // this does not work

            ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase(imdb), 100, 10, 0);



            stamper.close();
            FileOutputStream fileOutputStream = new FileOutputStream(out);


            IOUtils.write(baos.toByteArray(), fileOutputStream);
        } catch (Exception e) {

        }

我也尝试使用Annotation如下:

                PdfAnnotation annotation;

                PdfName aa=new PdfName("test test");
                annotation = PdfAnnotation.createLink(stamper.getWriter(),
                        new Rectangle(50f, 750f, 180f, 800f),aa,PdfAction.gotoRemotePage("file:///D:/intro.pdf","1", false, true));


                annotation.setTitle("Click Here");

                stamper.addAnnotation(annotation, 1);

我还尝试使用@ Bruno Lowagie 下面的代码注释:[它在给定页面上创建链接,但是在intro.pdf文件中,当我点击同一页面上的链接时(intro.pdf) ] see in below image
如上图所示( intro.pdf页码-2 的图像)

                PdfReader reader1 = new PdfReader("D://introduction.pdf");
                PdfStamper stamper1 = new PdfStamper(reader1, new FileOutputStream("D://intro.pdf"));
                PdfAnnotation link1 = PdfAnnotation.createLink(stamper1.getWriter(),
                    new Rectangle(136, 780, 559, 806), PdfAnnotation.HIGHLIGHT_INVERT,
                    new PdfAction("D://introduction.pdf", 1));
                link1.setTitle("Click Here");
                stamper1.addAnnotation(link1, 2);
                stamper1.close();

提前致谢。

1 个答案:

答案 0 :(得分:1)

您需要指定协议。对于网页,您的URI以http://开头;对于文件,您的URI应以file://开头。

但是,由于要链接的文件也是PDF文件,因此您可能不希望使用setAnchor()方法。您应该使用setRemoteGoto()方法。请参阅MovieLinks2示例。

如果要添加指向现有文档的链接,请按照以下步骤操作:

PdfReader reader = new PdfReader("hello.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("hello_link.pdf"));
PdfAnnotation link = PdfAnnotation.createLink(stamper.getWriter(),
    new Rectangle(36, 790, 559, 806), PdfAnnotation.HIGHLIGHT_INVERT,
    new PdfAction("hello.pdf", 1));
stamper.addAnnotation(link, 1);
stamper.close();

如果查看PDF文档,您会看到名为hello_link.pdf的新文件包含引用旧文件hello.pdf的链接注释:

enter image description here