正则表达式应用之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进行批量处理,一是直接匹配然后替换,二是首先定位到具体位置然后执行一定的操作(如各级标题的设置)。
这里处理有两种方式:
修改class,然后修改对应的css文件对用项。
直接添加一些属性。
以下是当时其他操作使用的一些语句。
#去掉多出来的加粗的数字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# 代码中不起作用