创建现有Pdf的目录

时间:2013-06-03 18:48:26

标签: java itext

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

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

任何建议或示例都将受到高度赞赏。

2 个答案:

答案 0 :(得分: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();
        }
}

答案 1 :(得分: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

我不确定你在做什么背景。是否有足够的信息来弄清楚如何做到这一点?