reportLab渲染pdf

继续之前的工作。因为kindle支持的格式有限,所以剩下的只有mobi,pdf两个选择了。找了半天没找到合适的制作mobi文件的模块,所以选用了一个不错的制作pdf的模块——reportlab。

昨天折腾了半天,发现reportlab-userguide的第二章中最简单的helloworld例程输出的pdf文件在电脑中看还正常,在kindle的竖屏模式中看就没有字了,不过横屏模式倒是可以看到字。

我以一个什么都不知道的普通用户的心态猜测了下,可能是kindle为了尽可能将pdf表现的和txt文件差不多,采用了比较奇葩的解析方式,这样竖屏看的时候字比较大。

于是又把后面几张大概看了看,最后还是成功的输出了可以在kindle上阅读的pdf文件。

# 首先import需要用到的模块
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

其中后两条是为了使用自定义的字体。因为不太清楚kindle支持的中文字体有哪些,所以使用了华文宋体。

# 准备要用到的一些东西
STSong = r"/home/juiceyang/jianshuDownloader/STSong.TTF"
# 将华文中宋字体的注册名为"STSong"的字体,当然也可以取别的名字
pdfmetrics.registerFont(TTFont("STSong", STSong))
# 要生成的pdf的尺寸,对应的是kpw2的6寸屏,单位是postpoints
kpw2_size = (331.2, 476.2)
# 使用华文中宋的style模板,style的属性之类的可以看reportlab-userguide的5.6一节
styles = getSampleStyleSheet()
style = styles["Normal"]
style.fontName = "STSong"

STSong.TTF是从网上下载的字体文件,也许应该换成开源字体,不过为了做样例,就不再细改了。

# 新建一个文档
doc = SimpleDocTemplate("你好世界.pdf", pagesize=kpw2_size)
# 开头先插一个大空白
Story = [Spacer(1, 20)]
# 插入简体中文
chs = "我能吞下玻璃而不伤身体。"
p = Paragraph(chs, style)
Story.append(p)
Story.append(Spacer(1, 10))
# 插入繁体中文
cht = "我克藝吃玻璃,我不毀受傷。"
p = Paragraph(cht, style)
Story.append(p)
Story.append(Spacer(1, 10))
# 插入日文
jap = "私は硝子を食べられます。私を傷付けません。"
p = Paragraph(jap, style)
Story.append(p)
# 韩文不太常见就不测试了,输出文档
doc.build(Story)

最后输出的pdf的效果和在kindle上看得效果分别如下:

pdf

可以看出,kindle中竖屏模式浏览的效果和电脑上看的效果还是有些差别的,明显字大了很多。

简书下载器——使用BeautifulSoup4解析网页

虽然名字是下载器,不过实际上就是用python写的一个网络爬虫,通过某种规则将网页爬完,然后进行解析,获得自己想要获得信息。

而简书上的文章的集合方式大概有3种:

  • 文集(notebook),url为http://www.jianshu.com/notebooks/文集id/latest
  • 专题(collection),url为http://www.jianshu.com/collection/专题id
  • 用户(users),url为http://www.jianshu.com/users/用户id/latest_articles

下载器主要也就是批量下载这三种集合中的文章。

下面用一篇文章来解释下大概的工作原理。

这篇文章的url是http://www.jianshu.com/p/8862a4250944,可以看出来并没有像某些网页一样,带有.html/.php/.asp之类的后缀,是因为服务器有某些机制可以知道在访问这种没有后缀的url的时候,究竟是想访问哪些文件。

以chrome为例,如果按下F12打开Developer Tools,然后再刷新上面那篇文章,那么可以在Network下看到http://www.jianshu.com/p/8862a4250944.html这个文件的GET请求。如果将这个html文件下载下来,看代码的话,会发现我们想要的文章的内容都在这个html文件中有所体现。

就像wikipedia中说的一样,html只是一种组织信息的一种方法,我们所需要的文章中的信息(包括图片、引用等等)都在html文件中有所体现。我们所需要做的,就是通过html tag的类型,将信息分门别类,并下载到本地。最终再通过某种方式,按其性质制作回pdf文件当中去。

所以工作流程大概就是:获得html文件内容,解析html文件,重新排列内容,并制作成pdf文件。

获得html文件的内容可以使用python内置模块urllib/urllib2,我使用了urllib2(其实对于这么小的问题两个用起来差不多)。

import urllib2
html = urllib2.urlopen("http://www.jianshu.com/p/8862a4250944").read()
print html

这面那段代码可以将那片文章的html文件打开,并读出内容。如果便于理解的话,类似于open()和readlines(),只不过readlines()会返回一个list,这个会返回一个str。看输出的话就会发现str对象html的__str__()方法会返回html文件的内容,第一步完成。

解析html文件使用了BeautifulSoup4,安装方法在这片短文中已经简要介绍了。这个工具的功能就像一个筛子,通过html tag的不同,筛出使用者想要的内容。

from bs4 import BeautifulSoup
import urllib2
html = urllib2.urlopen("http://www.jianshu.com/p/8862a4250944").read()
soup = BeautifulSoup(html)
print soup.title

运行上面一段代码,就会发现输出内容为html文件的title标签的内容:

<title>简书干货内容推荐 - 简书</title>

所谓的筛子的功能,大概就是这样,所需要做的就是先预先找好要筛出来的tag的范围,然后用bs4筛出来。通过观察html的结构,可以看出文章的内容集中在<div class="show-content"></div>中,所以我们所需要做的也就只是找到class是show-content的标签,然后将其从html里面提取出来而已。这样第二步也就完成了。

之后也可以再一次通过标签的内容(比如<strong>、<a>、<blockquote>)再次筛选内容。即完成第三步。不过由于目前制作pdf的方法还在学习当中,输出的文件格式还是txt,也就没有必要进行第三步第四步了。所以现在是通过正则表达式直接删除了所有的html标签,丢掉了格式信息。在学习完了pdf制作方法后应该会再次进行第三步和第四步。

《如龙:维新》——伪幕末浮世绘

前些日子买了台PS3。本是想趁着寒假补补《合金装备》系列,结果回来之后先是完了《GTA5》又接着完了《如龙:维新》(以下简称《维新》),补老游戏的计划完全没有实现。趁着最近刚刚一周目完了《维新》,记下自己的感受。可能含有大量带有个人色彩的评价...

1. 故事背景

(Warning!以下大量剧透!Warning!)

因为之前并没有怎么接触过家用机平台,平时都是在steam上买游戏玩。所以许多很出名的游戏系列都只是停留在听说过的地步,并没有怎么接触过。《如龙》系列就是其中的一个。

大概查了查百科,《如龙》系列的几篇正作讲述了黑帮人物的故事,而《维新》是《如龙》系列的最新的外传,和正作没有什么剧情上的关联。(最重要的关联大概就是故事中的人物脸长得都一样?)

故事背景设置如同名字『维新』所昭示的,选择在了风起云涌、人才辈出、老套而王道的幕末时代。游戏中的主人公也是十分著名的维新人士——坂本龙马。作为一个轻度历史题材爱好者,这个环境的选择还是挺能吸引我的。

但是由于之前看过大河剧《龙马传》,有些担心被电视剧剧透过游戏便没什么乐趣。不过玩完之后再纵观游戏的整个剧情,基本可以说对得起游戏开头『本游戏根据历史改编,和真实历史没有任何关系』那句话。

游戏巧妙的处理了龙马早亡的问题,通过偷梁换柱大法,使用新选组三番队队长斋藤一的身份活生生的为龙马『续命』到了明治时代。整个故事的剧情也得以从『勤王党』兴起,一直覆盖到了『大政奉还』完成,基本完整的覆盖了整个幕末时期。不会因为龙马早早的在近江屋被暗杀,导致故事在中途戛然而止。

故事也是紧紧围绕着龙马追凶这一明线,以及改变日本这一暗线,讲述龙马的爱恨情仇,情节也算得上是跌宕起伏,迷雾层层。不会玩着玩着犯困,多少有些引人入胜吧。

不过这样的剧情安排也有其问题。历史本是严谨的学问,随意修改一个人物的生平自然会牵一发而动全身。龙马变成了斋藤一,其周围的人的生平也自然会发生变动。所以新选组内发生了重大变动,试卫馆一派早早的几乎死绝;『勤王党』成员中岡摇身一变,站在对立面上变成了警察;船中八策的提出者变成了无双国士进藤勇;戊辰战争被成功避免,德川庆喜一如既往的怂;萨长同盟上位失败,倒幕派恐成最大输家......

可以看出,故事真的是和历史没有什么关系了。倒不是说架空剧情不好,三国演义也是架空剧情嘛。架空剧情可以有,不过怎么也要架的合理。在《维新》的被修改成这样的故事背景下,许多事情都显得有些滑稽。

RyuGaGotoku_Ishin_Cover

从游戏封面来看,其实游戏不应该叫《如龙:维新》,而应该改名叫《如龙:新选组传奇》

首先游戏是以『维新』作为副标题的,反观本作中最大的维新派变成了谁呢?答案就是卧底在保幕派内部的新选组组长进藤勇。(没想到你个浓眉大眼的也叛变了革命啊!)

其次,幕末中的一大『尊王攘夷』派势力『土佐勤王党』首领武市瑞山因为威胁藩主统治,本应被山内容堂公肃清。结果在游戏中变成了容堂公的狗腿子。

再其次,幕末中的重要势力『萨长同盟』游戏中完全就是打了个酱油...『大政奉还』之后的实权派人物具体是谁完全没说,草草结尾,想必都不是真实历史中的那些人了吧,整个世界线可能都会发生巨大变动,甲午战争大青果打赢了也说不定。

在这样的人物安排下,故事的叙事发生了巨大偏移。我认为本来幕末之所以迷人,就是因为像三国一样,是一个群雄并起的时代,精彩就精彩在流不尽的英雄血。可是在《维新》之中,叙事基本围绕着新选组,忽视了许多有趣的人——比如龙马的姐姐、胜海舟、土佐参政后藤象二郎、德川庆喜等等,他们的心态在那样的巨变的时代背景下本是十分有趣值得细细描述的(如《龙马传》中对后藤象二郎的心理描写,海援队时代前后对龙马的态度变化),《维新》里要么忽略、要么就是简单的贴标签、站队式地划分『好人』与『坏人』,十分无趣。

2.游戏内容

《维新》的关卡设计仍旧以普通的线性关卡为主,但是触发的地点是在沙盒地图中。其沙盒地图以京都作为背景,分为了洛内、洛外、衹园、壬生、骸街五个区;另外进入主线任务地图之后,一般会切换到普通的管道式的关卡设计。在京都城区的地图中,也经常会遇到支线任务,或是『挑衅的不法浪人』之流,也会触发战斗。

kyoto

京都的沙盒大地图,可以看出还是挺传统的沙盒地图。

从画面上来说,游戏的画面还不错,毕竟是PS3末期发售的游戏了,也许制作者已经将PS3的机能利用的差不多了,而也不能对上一代的PS3再有什么过高的要求。除了在地图的复杂地形中偶有几乎肉眼不可见的帧数下降以外,基本已经无可挑剔了。

我认为游戏制作者对于京都的生活环境的复原还是比较不错的,站在洛内商业街中感受着周围的熙熙攘攘,会有挺不错的带入感。

游戏中亦像生活中一样,有各种各样的饭馆、娱乐场所、道场、货郎等等。玩家可以在货郎那里买各种商品,在饭店吃饭喝酒回血,在娱乐场所内玩内置的osu!,在道场练习剑技等等。可以说基本完整的还原出了一个日本幕末版本的标准GTA中的城市。(鬼知道那个时候京都有没有卡拉ok呀!)

q5qUoJ_ckaeVqKc

没有人的伏见大街上,可以看出还是挺繁华的。

游戏甚至还通过任务,为玩家在郊外安排了一处宅子,玩家可以在里面愉快的种菜、烹饪、调戏小萝莉(大雾)。可以看出制作者还是挺想让玩家体验一下多姿多彩的幕末生活的。(其实是延长游戏寿命?)

游戏的战斗系统也颇为丰富,主角有四种形态自由切换,时而掏出阎罗刀大杀四方,时而掏出黑檀木或是白象牙华丽点射,时而进入魔人状态表演『摔跤』(大雾)。四个战斗形态四种技能树,玩家可以通过战斗获取经验值,然后点技能。

不过战斗场景里的镜头有时有些别扭,尤其是一套连击打到墙角的时候,镜头往往会突然旋转一下,很容易因此莫名其妙的看不到敌人的攻击,掉血掉的很冤。如果能够自动的将镜头拉远,我觉得会好很多。不过作为一个非动作游戏,控制感做成这样我已经比较满足了。

游戏的音乐也不错,主题曲是ONE OK ROCK的燃曲《Clock Strikes》。另外,网上也可以下载到2CD的OST。我大概听了两遍,电吉他用的比较多的感觉,多数曲目节奏感都比较强,但是旋律都一般,没听到像《Rebirth the edge》这样主旋律特别明显的上耳的曲子,CD1里面Track24《La Muerte Del Gobierno》我觉得比较好听。

另外就是游戏的配音演员了,阵容还是不错的。比如桂小五郎就带有强烈的山寺宏一范儿,玩游戏的时候总是会想起来《攻壳机动队》里的托古萨。之前提到的郊外小院里的小萝莉由钉宫配音,各位钉宫病患者可以在种菜和烹饪上多花些时间。桂小五郎开的酒吧里的女酒保幾松的CV竟然是平野绫,完全没有听出来,还是最后看STAFF表看到的,简直团员失格。

3.对于游戏的评价

题目中都说了,《维新》是『伪幕末浮世绘』。总要解释一下,这是因为《维新》只是一个普通的复仇剧本强行披上了时代剧的外套。

先从浅显的一方面说。沙盒式的关卡设计一个优点就是可以让玩家很好的融入关卡当中,通过支线获得更佳的带入感。可以看出《维新》的制作者也想通过这样的方式使玩家获得更好的游戏体验。

但是如果审视一下游戏中的支线任务,却往往和时代脱钩,只是强行的将逻辑判断或是简单的跑腿放在了那个环境中。说白了也就是只是给NPC换了件衣服而已。

如果我们对比下同时代的《GTA5》,就可以发现《GTA5》中的支线NPC都是具有Los Santos那个城市的物欲、荒诞的特性的,玩家在完成任务时,会加深对Los Santos这个城市的这种印象。然而在《维新》中,支线NPC就没有这样的功能。

真正传达了制作者意图的,可能也只有地图中的种种贴图和NPC的各种方言而已。

从深层次的方面来说,《维新》也过于英雄主义了一些、表象了一些。新选组死了几个末流队长便濒临倒闭,龙马闯进江户城只手完成『大政奉还』,打一架喝场酒便促成了『萨长同盟』。

如果用历史游戏的标准来要求它的话,我觉得还是浅显了些。『大政奉还』的真正原因并不是船中八策,『萨长同盟』的原因也并不是桂、西乡同龙马的关系都不错,真正的原因——地方势力和中央势力的此消彼长以及殖民化危机——并没有被揭示出来。如果我们将《维新》看作一个历史游戏来说,其实是不合格的。

在这样的游戏制作思路下,《维新》也难免落入了『抗日神剧』的英雄主义坑,也难怪玩家玩着玩着会出戏了。

写了个批量下载简书文章的工具

前言:这个脚本目前只能用来下载文本,也就是说下载下来的都是txt文件。以后可能会写输出pdf文件的脚本,以后的事以后再说啦┐(´_`)┌

前几天zhihu上有人问怎么批量下简书上的文章到kindle上看,恰好上个学期用了beautifulsoup,趁着手热,写了个简书的批量下载工具。以下是简单的使用方法,linux平台下使用很简单,就不细说了,主要记录下windows的使用过程。

1.首先从这里下载python2,安装就是各种下一步,没什么好说的。

2.从这里右键另存为下载get-pip.py,安装方法就按照网页上的安装。

get-pip

比如下载到了桌面上,就先进入桌面的路径,然后python get-pip.py即可。

3.安装BeautifulSoup,这东西大概理解可以理解为一个筛子,把网页中需要的东西筛选出来。安装方法是在cmd中运行安装命令:

pip install beautifulsoup4

bs4

至此脚本的运行环境已经安装完毕了。

4.从这里下载脚本,下载完解压出来。比如解压到了一个名叫jianshuDownloader-master的文件夹下。在jianshuDownloader-master中新建两个空文件——userlist.txt和notebooklist.txt。

userlist.txt中存放批量下载的用户名。比如我们想批量下载该用户的文章,url为http://www.jianshu.com/users/5104d005424d/latest_articles,我们需要的就是users/和/latest_articles中间的那串字符。简单来说可以把它看成用户的『身份证号』,能唯一识别出是哪个用户。

userlist.txt中可以存放多个用户的『身份证号』,比如我们想下载5104d005424d、7041c064cbd2、2659558557cc三位用户的所有文章,就把他们的『身份证号』每行存一个就行了。

userlist

userlist.txt中存放用户的『身份证号』

 

同理,notebooklist.txt中用来存放文集的编号。比如我们想下载这个这个这个三个文集中的所有文章。就把这三个文集的编号存到notebooklist.txt中,存的方法和userlist.txt的一样,也是一行一个。

notebook

notebooklist.txt里面存文集的编号

 

5.最后一步就是双击main.py,按照提示选择是按用户下载还是按文集下载了。

输入1按用户下载,输入2按文集下载。

由于现在是用正则直接把html里面的标签去掉,所以比较慢,不过既然是为了省鼠标,运行起来别管就好了...以后可能会抛弃这种做法,不过以后的事以后再说啦┐(´_`)┌

另外我也不知道为啥linux下和windows下速度差那么多...

还有windows的cmd里面一涉及到中文就烦得不行,直接用英文了...

下载完成之后会自动退出,然后下载好的txt就放在jianshuDownloader-master\data文件夹下了,在然后拷进kindle里看就好了。

IMG_20150212_052232

随便拷进去一篇文章,大概效果就是这样了

 

后记:这玩意儿纯属一个代码爱好者的练手作,请各位老爷要求不要太高。如果有问题我尽量修改