osbzr / gooderp_addons

可能是中国用户数最多的开源ERP
http://www.gooderp.org
1.33k stars 750 forks source link

docx文档打印时,如内容包含 & 符号会报错 #1543

Open GoodERPJeff opened 7 years ago

GoodERPJeff commented 7 years ago

操作系统及版本:

重现问题的步骤:

  1. 新建产品 A&B

  2. 新建其他入库单,该产品入2件

  3. 打印其他入库单

...

当前结果:

报错

截图:

期望的结果:

正常打印输出docx文件

GoodERPJeff commented 7 years ago

实际上现在就是支持的,文档正文部分用 {{ obj.company_id.logo|picture }} 可以显示图片,只是页眉页脚不识别。是docxtpl的缺陷

lonelyleaves commented 7 years ago

暂晒是只发现&符号会报错,*和#都可以正常打印

gilbert-yuan commented 6 years ago

docxtpl 支持 页眉页脚 显示图片 只是写法麻烦了点 https://github.com/elapouya/python-docx-template/blob/master/tests/header_footer_image.py 对应ISSUE 回答 https://github.com/elapouya/python-docx-template/issues/51

GoodERPJeff commented 6 years ago

其实还是没搞懂该怎么玩。 要不静静以其他出库单为例做个模板?页眉上加个当前公司logo的图片

gilbert-yuan commented 6 years ago

嗯,不忙了,我看看

gilbert-yuan commented 6 years ago
        tpl = DocxTemplate(misc.file_open(report.template_file).name)
        # 2016-11-2 支持了图片
        # 1.导入依赖,python3语法
        # 2. 需要添加一个"tpl"属性获得模版对象
        tpl.replace_media('/Users/yuan/myerp/test/gooderp_addons/money/template/picture.jpg',
        '/Users/yuan/myerp/test/gooderp_addons/report_docx/picture_hearder.jpg')
        tpl.render({'obj': data, 'tpl': tpl})
        tpl.save(temp_out_file)

money.order.get.docx 收款单 (6).docx 页眉页脚图片和正文 插入图片还是有差异的 只能用替换的方式(另外要更新到最新的 docxtpl 这个最新版,好像是没有更新到pip 手动安装的 版本 0.47 )

GoodERPJeff commented 6 years ago

tpl.replace_media('/Users/yuan/myerp/test/gooderp_addons/money/template/picture.jpg', '/Users/yuan/myerp/test/gooderp_addons/report_docx/picture_hearder.jpg')

这句,后面替换成当前公司的logo,怎么写?

另外,前面的是绝对路径,那换个电脑不就没用了?

origin0119 commented 6 years ago
font{
    line-height: 1.6;
}
ul,ol{
    padding-left: 20px;
    list-style-position: inside;
}

请问这是什么邮件,为什么我一直会收到~

在2018年04月10日 20:58,开阖软件 Jeff Wang<notifications@github.com> 写道: 

tpl.replace_media('/Users/yuan/myerp/test/gooderp_addons/money/template/picture.jpg', '/Users/yuan/myerp/test/gooderp_addons/report_docx/picture_hearder.jpg') 这句,后面替换成当前公司的logo,怎么写?

—You are receiving this because you are subscribed to this thread.Reply to this email directly, view it on GitHub, or mute the thread.

    a#ntes-pcmail-signature-default:hover {
        text-decoration: underline;
        color: #3593db;
        cursor: pointer;
    }
gilbert-yuan commented 6 years ago

可以替换掉的。。这么写只是验证解决思路可行。抽时间,再整理下

gilbert-yuan commented 6 years ago

@jinja2.contextfilter
def picture_header(ctx, data, width=None, height=None, align=None):
    """
    把图片的二进制数据(使用了base64编码)转化为一个docx.Document对象

    data:图片的二进制数据(使用了base64编码)
    width:图片的宽度,可以为:'12cm','12mm','12pt' 等,参考前面的 calc_length()
    height:图片的长度,如果没有设置,根据长度自动缩放
    align:图片的位置,'left','center','right'
    """

    if not data:
        return None

    # 转化为file-like对象
    # 在python2.7中,bytes==str,可以直接使用
    # 在python3.5中,bytes和str是不同的类型,需要使用base64这个库

    # data使用了base64编码,所以这里需要解码
    data = data.decode('base64')
    #
    # import io
    # data = io.BytesIO(data)
    def generate_temp_file(tempname, suffix='docx'):
        return os.path.join(tempname, 'temp_%s_%s.%s' %
                            (os.getpid(), random.randint(1, 10000), suffix))
    tpl = ctx['tpl']
    tempname = tempfile.mkdtemp()
    temp_out_file = generate_temp_file(tempname, suffix='jpg')
    with open(temp_out_file, 'wb+') as picture:
        picture.write(data)
    path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
    tpl.replace_media(path + '/GoodERP_AD.gif', temp_out_file)
    return ''

def get_env():
    """
    创建一个jinja的enviroment,然后添加一个过滤器 
    """
    jinja_env = jinja2.Environment()
    jinja_env.filters['picture_header'] = picture_header
    return jinja_env

1be284a6-4466-46e5-8694-2f1b89bc3bb7 a764721d-b8f4-4d76-af65-8f48a2cfd6d7 c2b5a2c9-3288-447b-a1e0-4210ba2770dc