C4droid / blog

白天上班,晚上看书,假日批判
1 stars 0 forks source link

瞎折腾01:制作一本电子书 #51

Open C4droid opened 4 years ago

C4droid commented 4 years ago

背景

取这么个名字,并非是指从0开始制作一本电子书,只是一时没想到恰当的题目而已。

俺比较喜欢收集书籍,特别是那种排版比较漂亮的。扫描版不行,还必须得是文字版。

《二十四史》里面有几本没收全,恰好在某网站找到了排版还过得去的资源。

美中不足的是:整本书被拆开了,每页都弄成了一个独立的文件;没有目录,浏览时不方便跳转。

那咱只好自己动手完善啦!

合并pdf

用到了 pdfjam ( TexLive 套件里面刚好有)

将 file1.pdf 、file2.pdf 合并为名叫 target.pdf 的文件
pdfjam file1.pdf file2.pdf -o target.pdf

俺找的那本书足足有3125页,对应3125个文件,手动敲命令不得累死啊!

得想办法将所有的文件名列出来,拼成一行,当作 pdfjam 的参数

ls *.pdf | sed ':a ; N;s/\n/ / ; t a ; ' | xargs pdfjam -o test.pdf

添加目录

Ubuntu 系统里刚好自带了一个工具 ghostScript,可以为pdf添加书签

根据 pdfmarks 文件,为 in.pdf 文件添加目录,最后导出为 out.pdf
gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf in.pdf pdfmarks

pdfmarks

就是个纯文本文件,里面内容长这样

[/Title (Section 1) /Page 10 /OUT pdfmark
[/Title (Section 2) /Page 20 /OUT pdfmark
[/Title (Section 3) /Page 30 /OUT pdfmark
[/Title (Section 4) /Page 40 /OUT pdfmark

咱只需要将 Section X 替换成咱想要的标题,将 10、20、30、40 等替换成相应的页码就行了

多级目录

在父目录前面加个 /Count x,标志下有x条子目录,没啥难度

[/Count 2 /Title (Chapter 1) /Page 2 /OUT pdfmark
[/Title (Section 1.1) /Page 3 /OUT pdfmark
[/Title (Section 1.2) /Page 4 /OUT pdfmark
[/Count -1 /Title (Section 1.2) /Page 5 /OUT pdfmark
[/Title (Section 1.2.1) /Page 6 /OUT pdfmark

pdf 目录中文乱码

linux 终归是洋人做出来的,对 CJK 字符支持不够好,得费点功夫 不能直接写中文,得写 unicode 码。

 宋史 --> 宋(5B8B)史(53F2) --> <FEFF5B8B53F2>
[/Title (宋史) /Page 10 /OUT pdfmark
[/Title <FEFF5B8B53F2> /Page 10 /OUT pdfmark

生成 pdfmarks

下面是咱抓数据时的自用代码,留做记录

$('#mCSB_1_container a').each(function(index, e) {
  var content = "[/Title <FEFF" + $(e).attr('title') + "> /Page " + $(e).attr("data-page") + " /OUT pdfmark";
  content.replace(/([\u4E00-\u9FA5]|[\uFE30-\uFFA0])/g,function(){
      return RegExp["$1"].charCodeAt(0).toString(16).toUpperCase();
  })
})

reference

add-toc-to-pdf-from-xml-json-file wrong-encode-when-update-pdf-meta-data-using-ghostscript-and-pdfmark