正则表达式应用之PDF To ebook

Posted 桥的断想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式应用之PDF To ebook相关的知识,希望对你有一定的参考价值。


kindle上面PDF的支持不是很好,看起来十分的费劲。于是萌生了PDF转电子书格式(如azw3、epub、mobi等)的想法。使用转换软件能够将格式转过来,但是显示上还是存在问题的。以我转换的“黑客攻防技术宝典:浏览器实战篇”为例。我使用的软件是Calibre,转换后出现了以下问题。

  • 整本书的字体几乎相同

    什么一级标题,二级标题统统没有。

  • 生成的目录无法使用

    目录看着正常但就是不能正常定位,鉴于上面出现的问题这个应是理所应当的。

  • 页眉、页脚乱入

    PDF的页眉、页脚被保留下来了。

  • 段落分段异常

    一段话,乃至一句话有可能被分为好几段。如果以后看到这样的电子书的时候,你就知道,这只是单纯用了转换软件转换了一下而已。

  • 图片没有居中

    看起来有点别扭。

  • 图片的标题没有居中

    会误以为是内容,影响阅读。

  • 图片的位置错误

    相当多的图片位置偏移,大都在图标标题的上方不远处。

出现的这些问题基本都是排版上的问题,转换后的内容几乎没有丢失。有问题那么就一一解决。

首先用“Edit E-book 64bit”打开转换后的电子书,这里以azw3为例。calibre支持编辑azw3和epub格式的电子书。打开后就是这样效果。

文本部分是书的主题部分,其实这些电子书使用的是html作为载体的。这些电子书的制作其实和静态网页的制作差不多。其实更简单,使用的标签很少。由于待会儿会用程序来辅助,所以把被分为好几部分的正文本合并起来,以方便处理。

样式部分是外链的样式,用于设置相被封为应标签的样式。

单独处理正文前的内容。

    可以接删掉目录,所有的修正好之后,可以自动生成。

    后来发现也可以不删除,用notepad++替换时有选择性的跳过和替换。

接下来的会使用到正则表达式进行替换和判断。

首次找到异常的地方,仔细观察有什么特征。因为转换使用的是同一算法,所以异常的地方往往有其特征。如“处理图片标题 居中处理”为例。

<p class="calibre1">图5-24  激活时的Clippy </p>

观察后发现,图片的标题都是这样的格式:

<p class="calibre1">图章节书-图片标号  图片标题 </p>

对用匹配的正则表达式如下:

^<p class=\"calibre1\">图[0-9]{1,}-[0-9]{1,}\s*.*</p>$

其实一上的表达式并不十分的准确,但在已经这里足以了。可以在Calibre Edit中查找看看该正则表达式是否好用。

然后进行替换,遗憾的是Calibre Edit中不支持在正则表达式中用小括号取得匹配内容,在替换的语句中用“$数字”替代。刚开始我使用python来进行替换,后来发现了些小问题。如字符编码问题(部分内容,使用相同的匹配语句Calibre和Notepad++能够匹配,但是python匹配不了。最后想想应该是编码问题)。后来使Notepad++进行有选择性的替换,“有选择性的替换”这是使用Notepad++进行替换的一大有点。这是编程语言无法做到的,写的程序只能要么全部修改,要么全部不修改。另外,Notepad++也支持用“()”来取得匹配到的内容。最终于我是这样使用这三个工具的:使用Calibre进行预览,首先找到问题,然后写正则表达式,修改好之后,最后预览检验是否达到预期效果;使用Notepad++进行有选择性的替换;使用python进行批量处理,一是直接匹配然后替换,二是首先定位到具体位置然后执行一定的操作(如各级标题的设置)。

这里处理有两种方式:

  1. 修改class,然后修改对应的css文件对用项。

  2. 直接添加一些属性。

以下是当时其他操作使用的一些语句。

#去掉多出来的加粗的数字newLine1 = re.sub(r"<p class=\"calibre1\"><b class=\"calibre3\">[0-9]*\s</b></p>","",line)
newLine2 = re.sub(r"<b class=\"calibre3\">[0-9]*\s</b></p>","",newLine1)#去掉页眉newLine1 = re.sub(r"^<p class=\"calibre1\">[0-9]*\s*第\s[0-9]*\s章.*</p>$","",newLine2)
newLine2 = re.sub(r"^<p class=\"calibre1\"><a id=\"p[0-9]*\"></a>[0-9]*\s*第\s[0-9]*\s章.*</p>$","",newLine1)
newLine1 = re.sub(r"^<p class=\"calibre1\"><a id=\"p[0-9]*\"></a>[0-9]*\.[0-9]*.*[0-9]* </p>","",newLine2)
newLine2 = re.sub(r"^<p class=\"calibre1\">[0-9]{1,}\.[0-9]{1,}\s.*[0-9]{1,} </p>","",newLine1)#处理图片标题 居中处理newLine = newLine2;if newLine != "\n":    if(re.match("^<p class=\"calibre1\">图[0-9]{1,}-[0-9]{1,}\s*.*</p>$",newLine) != None):
        newLine = newLine.split("calibre1")[0] +"calibre1\" style=\"text-align: center"+newLine.split("calibre1")[1];   
#设置各级标题idNum=""if(re.match("<p class=\"calibre1\">1[0-9]\.[0-9].*</p>",newLine) !=None):    # print newLine,len(newLine)
    if len(newLine) < 70:        # print newLine

        idList = "titleIndex"+newLine.split(" ")[1].split(">")[1].split(".")[0]+"_"+newLine.split(" ")[1].split(">")[1].split(".")[1]        try:            if(newLine.split(" ")[1].split(">")[1].split(".")[2]):
                idList = idList + "_" + newLine.split(" ")[1].split(">")[1].split(".")[2]
                idNum="3"
        except:
            idList =idList
            idNum ="2"
        newLine = "<h"+idNum+" id=\""+idList+"\" style=\"text-align: center;\">"+newLine.split("\">")[1]
        newLine = newLine.split("</p>")[0]+"</h"+idNum+">"
        print  idNum,idList

最麻烦的是图片位置的修正,自动化的程序还完不成。于是还得手动找,结合正则表达式进行查找定位稍微快点,但很繁琐。

最后,最好通读一遍看一看是不是都修改好了。

最后的最后,我把制作好的”黑客攻防技术宝典:浏览器实战篇”放到了网盘里面和大家分享一下,这本书很好,值得在地铁上看。

链接: https://pan.baidu.com/s/1jIeOFMe 密码: 666d



以上是关于正则表达式应用之PDF To ebook的主要内容,如果未能解决你的问题,请参考以下文章

俗话:学好正则表达式,走遍天下都没事!最详细的正则入门教程!

包含正则表达式分隔符的简单且经过测试的在线正则表达式在 C# 代码中不起作用

包含正则表达式分隔符的简单且经过测试的在线正则表达式在 C# 代码中不起作用

通过 Java 正则表达式提取 semver 版本字符串的片段

Python学习笔记之正则表达式

如何在 Python 中应用正则表达式替换?