首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > PowerDesigner >

Django 生成PDF(2)

2013-10-22 
Django 生成PDF(二) Django 生成PDF(二)接上文,我们本次使用RML来实现对PDF的生成与保存。关于reportlab的

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'

更多详情请参见下文。


热点排行