Django 生成PDF(二)
Django 生成PDF(二)
接上文,我们本次使用RML来实现对PDF的生成与保存。
关于reportlab的详细信息,请戳以下链接:http://www.reportlab.com/software/opensource/。
本人用reportlab生成PDF的详细流程如下:
第一步,下载安装reportlab。这一步我就不赘述了。第二步,实现Demo。值得高兴的是,它提供了一个在线的Demo,http://www.reportlab.com/static/cms/files/RLtutorial.zip ,不过很遗憾,下载下来后不能用,报如下错误:
#!/usr/bin/python# -*- coding: utf-8 -*-__author__ = '喵喵'import osimport preppyimport loggingimport tracebackimport trml2pdffrom django.conf import settingsimport reportlab.lib.stylesfrom reportlab.pdfbase import pdfmetrics, ttfontsfrom reportlab.lib.fonts import addMappingoperation_logger = logging.getLogger('operation')bug_log = logging.getLogger('bug')class PDFUtils(object): """ PDF 生成工具类 将一个标准的RML文件正常解析为PDF文件,保存并返回。具体参数如下""" def __init__(self, font_dir=os.path.join(settings.HERE, 'utils', 'pdf', 'fonts'), static_dir='http://%s/static' % settings.HOST_NAME): """ 构造方法 @param font_dir 需要注册的字体文件目录 @param static_dir 静态文件地址目录 """ super(PDFUtils, self).__init__() self.STATIC_DIR = static_dir try: # 注册宋体字体 pdfmetrics.registerFont(ttfonts.TTFont('song', os.path.join(font_dir, 'STSONG.TTF'))) # 注册宋体粗体字体 pdfmetrics.registerFont(ttfonts.TTFont('song_b', os.path.join(font_dir, 'STZHONGS.TTF'))) except: bug_log.error(traceback.format_exc()) addMapping('song', 0, 0, 'song') # normal addMapping('song', 0, 1, 'song') # italic addMapping('song', 1, 1, 'song_b') # bold, italic addMapping('song', 1, 0, 'song_b') # bold # 设置自动换行 reportlab.lib.styles.ParagraphStyle.defaults['wordWrap'] = "CJK" def create_pdf(self, data, templ, save_file): """从二进制流中创建PDF并返回 @param data 渲染XML的数据字典 @param templ 需要渲染的XML文件地址(全路径) @param save_file PDF文件保存的地址(全路径) """ # 读取模板文件 template = preppy.getModule(templ) # 渲染模板文件 namespace = { 'data': data, 'STATIC_DIR': self.STATIC_DIR, } # 渲染PDF页面 rml = template.getOutput(namespace) # 生成PDF pdf = trml2pdf.parseString(rml) # 保存PDF open(save_file,'wb').write(pdf) return True if __name__ == '__main__': pu = PDFUtils() # 模板页面地址 temp_path = os.path.join(settings.HERE, 'templates', 'pact', 'products.prep') for c in cerfts: pdf_path = os.path.join(settings.HERE, 'medias', 'pdf_pact', 'product.pdf') # 如果PDF不存在则重新生成 if not os.path.exists(pdf_path): pu.create_pdf(c, temp_path, pdf_path) print 'done'