「这是我参与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时, 如果你打开了 视图 => 显示/隐藏 => 工具栏项目 => 显示页面导览工具 => 显示所有页面导览工具, 那么你就会看到这个
也就是 /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) {}