分类
Java

[JavaFx] PDF 工具:目录、合并、密码

这是一个去年写的自用小工具。有些 PDF 文件没有目录,所以想自己加上,还有的分章节的小文件想合并为一个文件,就有了这个软件。
这几天又看了下几个 PDF, 发现在 Firefox 里目录不能正常跳转,于是修复了一下软件。


为什么用 Firefox 看 PDF 呢,之前用 Windows 的话,都是用 Sumatra PDF 的,Mac 上用则一般用预览。但是有时晚上看的话,白花花的背景太刺眼了,正好浏览器也可以打开 PDF, 于是想着在浏览器里打开,可以用反色把白色背景变成黑色~ 就是使用 filter: invert(.8) 这条 CSS 规则进行反色

我先在 Edge 里试了下效果,还可以:

在 Edge 中查看 PDF 文档

但是发现不显示目录……
又换 Chrome:

在 Chrome 中查看 PDF

发现这个可以显示目录,不过隐藏在二级菜单里。
最后试了试 Firefox:

在 Firefox 中查看 PDF

这个更方便,可以作为侧栏一直显示呢。

但是,之前做的目录在 Chrome, Sumatra PDF, 预览里都可以正常跳转,唯独在 Firefox 里不能,于是我找了个原本带目录的 PDF 在 Firefox 打开,发现人家的跳转链接是这样的:#[{"num":3,"gen":0},{"name":"XYZ"},69,784,0],而我的文件目录的链接却没有后面的三个数字。

看了下 itextpdf 文档 SimpleBookmark 这个类:

  • “Action” = “GoTo” – “Page” | “Named”
    • “Page” = “3 XYZ 70 400 null” – page number followed by a destination (/XYZ is also accepted)
    • “Named” = “named_destination”
  • “Action” = “GoToR” – “Page” | “Named” | “NamedN”, “File”, [“NewWindow”]
    • “Page” = “3 XYZ 70 400 null” – page number followed by a destination (/XYZ is also accepted)
    • “Named” = “named_destination_as_a_string”
    • “NamedN” = “named_destination_as_a_name”
    • “File” – “the_file_to_open”
    • “NewWindow” – “true” or “false”
  • “Action” = “URI” – “URI”
    • “URI” = “http://sf.net” – URI to jump to
  • “Action” = “Launch” – “File”
    • “File” – “the_file_to_open_or_execute”

原来那三个数字是 X, Y, Z,表示跳到目标页面的 (X,Y) 处,Z 好像是缩放的参数,一般不填。注意这里坐标的原点是页面左下角,所以要跳转到某个页面,XYZ 应该写成 0, height, 0, height 表示页面高度。应该需要加上 XYZ 吧,改了一版再用 Firefox 打开,果然就好了。

我发现 Firefox 打开 PDF 不像 Chrome 那样是在一个 embed 标签里,而是使用内嵌到 pdf.js 将整个文档每个页面都渲染为 HTML 页面,所以在 Firefox 里反色时,需要找到页面到父节点进行反色,因为它的工具栏、侧栏本来就是黑色的,不需要反色。

本软件源代码在 GitHub: YouthLin/pdf-utils 可执行 jar 包也可以在 Release 页面下载,运行需要 Java 8 环境(因为高版本的 Java 不带 JavaFx 了)


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

[/鼓掌] [/难过] [/调皮] [/白眼] [/疑问] [/流泪] [/流汗] [/撇嘴] [/抠鼻] [/惊讶] [/微笑] [/得意] [/大兵] [/坏笑] [/呲牙] [/吓到] [/可爱] [/发怒] [/发呆] [/偷笑] [/亲亲]