[更文挑战]iText番盘-PDF神器-27

173 阅读2分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战

PDF神器iText英文版翻译与学习

作者: 薛大郎.
英文原版: iText in Action 2nd Edition.pdf

坚持. 分享. 成长. 利他 !

一. 前言

成功与不成功, 可能就是差个坚持

更文挑战, 真的是一种挑战, 他让你每天都有一个任务必须完成, 如果不完成就断了. 最难能可贵的就是你一点时间都没有, 还要挤出时间来的这种坚持.

在这里恭喜shenyu: Apache ShenYu 成功入选 2021 科创中国·开源创新榜, 一直在shenyu社区活跃, 感受到这是一个充满朝气的项目和项目组, 希望自己有朝一日成为一个Apache Committer.

二.正文.

第二章 操作已有Pdf文档.

2.0 将Pdf文档做成交互式文档

这一节, 我们主要学习的内容有

  • 2.1 引入操作
  • 2.2 添加书签
  • 2.3 创建注解
  • 2.4 向Pdf中添加JavaScript脚本

2.1 引入操作

在使用Adobe Pdf Reader时, 如果你打开了 视图 => 显示/隐藏 => 工具栏项目 => 显示页面导览工具 => 显示所有页面导览工具, 那么你就会看到这个

image.png

也就是 /FirstPage,/PrevPage,/NextPage,/LastPage, /PrevView, /NextView 这些操作. 我们也可以通过使用PdfAction添加这些链接.

    Font symbol = new Font(FontFamily.SYMBOL, 20);
    // 四列的表格
    PdfPTable table = new PdfPTable(4);
    // 默认 不添加边框
    table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
    // 默认 水平居中
    table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
    // 添加一个 220 = Ü, 可能Symbol字体会将其改为 <=
    Chunk first = new Chunk(String.valueOf((char)220), symbol);
    // 设置他的操作为第一页.
    first.setAction(new PdfAction(PdfAction.FIRSTPAGE));
    // 将内容放到第一列
    table.addCell(new Phrase(first));
    // 添加一个 172 = ¬, 可能Symbol字体会将其改为 <-
    Chunk previous = new Chunk(String.valueOf((char)172), symbol);
    // 设置他的操作为上一页.
    previous.setAction(new PdfAction(PdfAction.PREVPAGE));
    // 将内容放到第二列
    table.addCell(new Phrase(previous));
    // 添加一个 174 = ®, 可能Symbol字体会将其改为 ->
    Chunk next = new Chunk(String.valueOf((char)174), symbol);
    // 设置他的操作为下一页
    next.setAction(new PdfAction(PdfAction.NEXTPAGE));
    // 将内容放到第三列
    table.addCell(new Phrase(next));
    // 添加一个 222 = Þ, 可能Symbol字体会将其改为 =>
    Chunk last = new Chunk(String.valueOf((char)222), symbol);
    // 设置他的操作为最后一页
    last.setAction(new PdfAction(PdfAction.LASTPAGE));
    // 将内容放到第四列
    table.addCell(new Phrase(last));
    table.setTotalWidth(120);

PdfAction继承自PdfDictionary, 也就是说他是一种Pdf的字典, 具有键值类型的, 其实最后维护的就是 /** 这个Map包含所有的简直对, 最后会关联到Document中. */protected HashMap<PdfName, PdfObject> hashMap;.

    // Chunk类的这两个方法也是设置的上百年提到的这个Map键值对.
    public Chunk setRemoteGoto(final String filename, final int page) {
            return setAttribute(REMOTEGOTO, new Object[] { filename,
                            Integer.valueOf(page) });
    }

    public Chunk setLocalGoto(final String name) {
            return setAttribute(LOCALGOTO, name);
    }

PdfAction中为我们内置了这些类型的操作:

public PdfAction(int named) {
    put(PdfName.S, PdfName.NAMED);
    switch (named) {
        case FIRSTPAGE:
            put(PdfName.N, PdfName.FIRSTPAGE);
            break;
        case LASTPAGE:
            put(PdfName.N, PdfName.LASTPAGE);
            break;
        case NEXTPAGE:
            put(PdfName.N, PdfName.NEXTPAGE);
            break;
        case PREVPAGE:
            put(PdfName.N, PdfName.PREVPAGE);
            break;
        case PRINTDIALOG:
            put(PdfName.S, PdfName.JAVASCRIPT);
            put(PdfName.JS, new PdfString("this.print(true);\r"));
            break;
        default:
            throw new RuntimeException(MessageLocalization.getComposedMessage("invalid.named.action"));
    }
}

所以也可以添加一些如setRemoteGoto()和setLocalGoto的操作:

new PdfAction(new URL("http://www.baidu.com/")));
new PdfAction("other.pdf", 1);
PdfAction.gotoRemotePage("other.pdf", rs.getString("country_id"), false, true);
PdfAction.gotoLocalPage("top", false);

源码为:

public static PdfAction gotoLocalPage(String dest, boolean isName) {}

public static PdfAction gotoRemotePage(String filename, String dest, boolean isName, boolean newWindow) {}

public static PdfAction gotoEmbedded(String filename, PdfTargetDictionary target, String dest, boolean isName, boolean newWindow) {}

public static PdfAction gotoEmbedded(String filename, PdfTargetDictionary target, PdfObject dest, boolean newWindow) {}