
偶然在b站看见好多人推这本Japanese-English Bilingual Visual Dictionary,用的是尚雯婕推荐这本书的微博,不过大多都是引流骗关注的,想找书自然有我们自己的途径。

zlib上能找到这本书的3个版本,2011,2018和2024的,2011的封面就是b站引流用的那版,后面两个版本只有epub,没有pdf,下载下来之后发现排版完全是乱掉的(我用的是SumatraPDF看的,不确定是否有其他阅读器能正常显示,不过把2024版的epub解压之后,可以看到每个网页都是正常的,于是考虑把它转成pdf格式试试。

首先考虑epub直接转pdf的工具,可惜免费的网络工具基本都不支持这么大的文件,况且本身这个epub排版可能也有问题,所以这个方法没试多久我就放弃了。
其次考虑网页转pdf,直接打印的话能控制的细节太少,搜索一下可以找到wkhtmltopdf这个工具,总之先尝试一下
C:\Users\lenovo\Downloads\jebvd>bin\wkhtmltopdf.exe OEBPS\page027.xhtml 27.pdf
Loading pages (1/6)
Warning: Blocked access to file C:/Users/lenovo/Downloads/jebvd/OEBPS/css/FontSrc.css
Warning: Blocked access to file C:/Users/lenovo/Downloads/jebvd/OEBPS/css/Styles.css
Warning: Blocked access to file C:/Users/lenovo/Downloads/jebvd/OEBPS/images/bg027_00.jpg
Error: Failed to load about:blank, with network status code 301 and http status code 0 - Protocol "about" is unknown
Error: Failed to load about:blank, with network status code 301 and http status code 0 - Protocol "about" is unknown
Error: Failed to load about:blank, with network status code 301 and http status code 0 - Protocol "about" is unknown
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
Exit with code 1 due to network error: ProtocolUnknownError
似乎是失败了,搜索一下错误信息,发现要加上这个参数--enable-local-file-access
C:\Users\lenovo\Downloads\jebvd>bin\wkhtmltopdf.exe --enable-local-file-access OEBPS\page027.xhtml 27.pdf
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done

这下好像是成功了,不过观察转换后的pdf,可以发现右边被切掉了一部分,可能是页面尺寸的问题,查找wkhtmltopdf的文档,用--page-size指定页面尺寸,默认是A4,试试A3
C:\Users\lenovo\Downloads\jebvd>bin\wkhtmltopdf.exe --enable-local-file-access --page-size A3 OEBPS\page027.xhtml 27.pdf
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
这回显示倒是完整了,但上下的白边太多了,所以正常的尺寸应该和A4相差不大,可是文档里也没有现成的合适的页面尺寸,所以正确的尺寸到底是多少呢?

虽然手动尝试,找到一个差不多的尺寸也可以,但这也太不优雅了,观察页面,发现它是用一张图片当背景,然后在上面添加文字来实现排版的,所以图片的尺寸应该就是页面的尺寸了,看下图片的属性,1603 x 1931,96dpi,换算一下就是424 x 511mm,好像太大了?不过折半之后和A4差不多,试试212 x 256mm,记得把上下左右的边距设成0,结果正好。另外用这个尺寸测试下封面和目录,也完美适配,下面就是想办法把所有的页面转成pdf了。
这个倒是不难,cmd内置的for就支持遍历文件,可惜我向来是记不住它的语法的,一般遇到这种需求,我的做法是在需要处理的目录下打开cmd,运行dir /b > 1.txt,得到文件列表,删除多余的文件,然后用正则处理一下得到bat脚本,再运行脚本即可。
bin\wkhtmltopdf.exe --enable-local-file-access -T 0 -B 0 -L 0 -R 0 --page-width 212mm --page-height 256mm OEBPS\cover.xhtml pdf\001.pdf
bin\wkhtmltopdf.exe --enable-local-file-access -T 0 -B 0 -L 0 -R 0 --page-width 212mm --page-height 256mm OEBPS\page002.xhtml pdf\002.pdf
bin\wkhtmltopdf.exe --enable-local-file-access -T 0 -B 0 -L 0 -R 0 --page-width 212mm --page-height 256mm OEBPS\page003.xhtml pdf\003.pdf
……
转换完成后再用pdftk合并一下,pdf差不多就做好了,浏览一下,效果很不错。
不过现在只能算是完成了80%,但众所周知剩下的20%才是最费事的。原始的epub文件内部是有超链接的,转换成pdf后超链接自然也保留了下来,可是现在它连接的对象是一个xhtml文件而非pdf的页面,关键是它的路径还是一个指向本地文件的绝对路径,这种事情我这个强迫症怎么能忍呢?所以要如何修改这些超链接的目标呢?

用pdf编辑器应该是可以解决这个问题,不过pdf编辑器基本上都很大,而且大多数都收费,平时我也不太用得上,所以就没装,并且要修改的超链接还挺多的,用编辑器一个个改也挺花时间的。还有其他方法吗?
当然是有的,也许你不相信,其实pdf文件是可以用文本编辑器编辑的。首先用pdftk的uncompress语法将pdf处理成未压缩的状态,然后我们就可以用vim打开了,需要注意的是vim要加上-b参数,这样保存的时候不会对非打印字符做任何处理。
pdftk.exe *.pdf output out1.pdf
pdftk.exe out1.pdf output out2.pdf uncompress
gvim.exe -b out2.pdf

不用太费劲就可以找到超链接的部分了,怎么把它改成链接到pdf页面呢?这个我也试了很久,总之略去过程,把上图中的5581行到5587行改成/Dest [n]即可。依然是一顿正则替换,试一下改过的pdf,可以跳转页面了,但是要跳转的页面似乎都多了一页,这是因为/Dest [n]其实链接到的是n+1页,为什么是n+1?因为是从0开始数的。而最开始的pagexxx.xhtml则正好是第xxx页,所以要怎么把这些数字都减1呢,好在vim正擅长做这种事,录一个宏,操作是查找下一个/Dest,然后按Ctrl+X,这个按键是把当前行光标后的第一个数字减1。
/\/Dest
qqnCtrl-xq
上次替换的时候提示替换了175次,由于录制宏的时候已经修改了第一处,所以把宏再执行174次,
174@q
这下就改完了。
pdf的内容已经处理好了,但是注意到epub本身是带目录的,我希望pdf也有书签,给pdf加书签倒是不复杂,用PDFPatcher就可以,epub的目录在toc.ncx里,而PDFPatcher可以导入xml格式的书签,先随便手动加几个书签,导出xml,接下来仍然是一顿正则替换,把toc.ncx处理成对应的格式,导回PDFPatcher,保存最终的pdf文件,这下终于算是处理完了。

最终的成果,书签齐全,内部链接跳转正常,图片质量和原epub一致,文字也都是可复制的。这下pdf可以收藏起来了。什么,看书?谁说找书一定是为了看呢(
