2

我正在尝试为现有的 pdf 文件创建目录,然后将目录页面合并到 pdf 文件中。页标题和相应的页码在单独的 excel 文件中可用。

我正在使用 iText 进行 Pdf 操作。我遇到的所有示例都与在创建新 pdf 时插入链接有关。但就我而言,我想为现有页面创建链接。

任何建议或示例将不胜感激。

4

2 回答 2

1

我终于找到了答案。感谢我的朋友指出我在 c# 中的一个例子。

java中的代码如下所示:

public class Test1 {
    public static void main(String args[]) throws Exception{
        PdfReader reader = new PdfReader(new RandomAccessFileOrArray("C:\\test.pdf"), null);
        Document doc = new Document(reader.getPageSize(1));
        PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("C:\\result.pdf"));
        Font link = FontFactory.getFont("Arial", 12, Font.UNDERLINE);
        doc.open();
        PdfContentByte pdfContentByte = writer.getDirectContent();
        Anchor topAnchor = null;
        PdfImportedPage page = null;
        for (int i = 1; i < reader.getNumberOfPages(); i++)
        {
            if (i == 1)
            {
                Anchor click = new Anchor("Click to go to Target");
                click.setReference("#target");
                Paragraph p1 = new Paragraph();
                p1.add(click);
                doc.add(p1);
                page = writer.getImportedPage(reader, i);
                doc.newPage();
                pdfContentByte.addTemplate(page, 0, 0);
            }
            else
            {
                if (i == 5)
                {
                    Anchor target = new Anchor("My targer");
                    target.setName("target");
                    Paragraph p3 = new Paragraph();
                    p3.add(target);
                    doc.add(p3);
                }
                page = writer.getImportedPage(reader, i);
                doc.newPage();
                pdfContentByte.addTemplate(page, 0, 0);
            }
        }
        doc.close();
    }
}
于 2013-06-04T18:16:48.950 回答
0

我寻找了我在Flying Saucer中制作的补丁,它可以点击链接并使其执行某些操作。这是很久以前的事了,所以我不确定这是否有帮助,但它似乎正在为此使用 iText。这是我认为我为此编写的代码片段:P

private void processLink(RenderingContext c, Box box) {
    Element elem = box.getElement();
    if (elem != null) {
        NamespaceHandler handler = _sharedContext.getNamespaceHandler();
        String uri = handler.getLinkUri(elem);
        if (uri != null) {
            if (uri.length() > 1 && uri.charAt(0) == '#') {
                String anchor = uri.substring(1);
                Box target = _sharedContext.getBoxById(anchor);
                if (target != null) {
                    PdfDestination dest = createDestination(c, target);

                    if (dest != null) {
                        PdfAction action = new PdfAction();
                        if (!"".equals(handler.getAttributeValue(elem, "onclick"))) {
                            action = PdfAction.javaScript(handler.getAttributeValue(elem, "onclick"), _writer);
                        } else {
                            action.put(PdfName.S, PdfName.GOTO);
                            action.put(PdfName.D, dest);
                        }

                        com.lowagie.text.Rectangle targetArea = checkLinkArea(c, box);
                        if (targetArea == null) {
                            return;
                        }

                        targetArea.setBorder(0);
                        targetArea.setBorderWidth(0);

                        PdfAnnotation annot = new PdfAnnotation(_writer, targetArea.getLeft(), targetArea.getBottom(),
                                targetArea.getRight(), targetArea.getTop(), action);
                        annot.put(PdfName.SUBTYPE, PdfName.LINK);
                        annot.setBorderStyle(new PdfBorderDictionary(0.0f, 0));
                        annot.setBorder(new PdfBorderArray(0.0f, 0.0f, 0));
                        _writer.addAnnotation(annot);
                    }
                }
            } else if (uri.indexOf("://") != -1) {
                PdfAction action = new PdfAction(uri);

                com.lowagie.text.Rectangle targetArea = checkLinkArea(c, box);
                if (targetArea == null) {
                    return;
                }
                PdfAnnotation annot = new PdfAnnotation(_writer, targetArea.getLeft(), targetArea.getBottom(), targetArea.getRight(),
                        targetArea.getTop(), action);
                annot.put(PdfName.SUBTYPE, PdfName.LINK);

                annot.setBorderStyle(new PdfBorderDictionary(0.0f, 0));
                annot.setBorder(new PdfBorderArray(0.0f, 0.0f, 0));
                _writer.addAnnotation(annot);
            }
        }
    }
}

这是在org.xhtmlrenderer.pdf.ITextOutputDevice中。

我不确定你在什么背景下工作。这些信息足以弄清楚如何做到这一点吗?

于 2013-06-03T19:39:49.997 回答