2014年6月21日 星期日 阴转晴
网站能抄到的,最多能抄抄前台的页面、css和js,后台代码还是要自己实现的。经过一周的调试,我终于调到PDF下载这块了,以前也没做过。 今天抽空调了一下,还算比较顺利,调试过程如下:
- 用xhtml2pdf xhtml2pdf is a html2pdf converter using the ReportLab Toolkit, the HTML5lib and pyPdf. It supports HTML 5 and CSS 2.1 (and some of CSS 3). It is completely written in pure Python so it is platform independent.
搜索了一下其他人的使用情况,说是简单pdf用这个简单的。
我是在SAE上用的,SAE是Python2.7的环境,所以我用的是Pypi上的代码,也是目前最多人用的,地址:https://pypi.python.org/pypi/xhtml2pdf/
如果是Python 3.3的话,用https://github.com/chrisglass/xhtml2pdf 上的源码吧
- Requirements
-
PyPDF2 1.19+ (optional)
-
实际上,我后来还不得不下载了Six
- SAE上的调试
我打开了Tornador的debug,所以能看到调试出错的信息。各种APPENGINE,是要阉割掉一些东西的,比如os.getuid(),如果遇到问题,就注掉代码,用try except来处理就好。源代码上有些备注,说APPENGINE不支持。
- 具体使用 在https://github.com/chrisglass/xhtml2pdf上是有一个demo的(含Django,wsgi等),参考简单写一下就好。
我简单写了一段代码,在SAE上可以生成pdf的。
[code]import xhtml2pdf.pisa as pisa import cStringIO as StringIO import cgi
class ExamDownload(TbHandler): def get(self,etsi = 0): print ‘—ExamDownload()–’ result = StringIO.StringIO() pdf = pisa.CreatePDF( StringIO.StringIO("""
例子1
Please enter some HTML code:Example 2
Example with template """), result )
if not pdf.err: self.set_header(‘Content-Type’,‘application/pdf’) return self.write(result.getvalue()) return self.write(’eeeeee’)[/code]
- 中文支持 上面代码,中文是显示有乱码的。 在网上搜索资料的过程中,我不得不修改hosts地址访问Google,因为baidu搜出来的实在太烂了。Google搜出来的和python邮件列表都没有一个完善的答案,我不得不多次尝试。那些人明明后来也解决了(在搜索的过程中,我断定我参考的这个网站的作者,应该就是西安到深圳再到上海的习惯使用Django的爸爸吧,要是美女我就发一封邮件请教了,呵呵),也不回帖说一下,今天我来总结一下。
最终我选择了在代码里修改默认字体为code2000.ttf(微软雅黑)的方法,大致如下:
5.1 找到一个微软雅黑的ttf文件,重命名为code2000.ttf。不重命名应该也没关系,下面代码参考写就好。我把reportlab\fonts这个目录下。 注意:有人提到,如果是gae之类的环境,放在static目录下是访问不到的。我的理解是,在gae上,static目录和代码目录应该不是在同一服务器上,所以访问不到。记得当年遍历gae代码的时候,资源文件是无法下载的。
总之,我没敢放在static目录下,我试过reportlab\fonts目录和fonts目录都是可以的。
5.2 修改xhtml2pdf\default.py里的DEFAULT_FONT(在几年前,还没有xhtml2pdf这个模块的时候,他们用的是pisa这个模块)。 把 #“helvetica”: “Helvetica”,改为"helvetica": “code2000”
5.3 注册code2000.ttf 修改xhtml2pdf_init_.py,在文件最后没加上下面几句
from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont pdfmetrics.registerFont(TTFont(‘code2000’, ‘reportlab/fonts/code2000.ttf’))
至此,pdf的中文也能正常显示出来了,如果用acrobat打开生成的pdf,可以字体包含有内建的微软雅黑了。HTML文件,也无需显示指定引用什么字体。
一些参考文献:
...