odoo14里面给下载PDF附件加水印
依赖包:pip install reportlab
Odoo 中附件的下载会经过 ir.http
的 def binary_content()
方法获取附件内容等必要信息,
所以我们需要继承 ir.http
模型并重写 binary_content
方法,对 PDF 类型的附件添加水印,
在 [models.py](http://models.py)
中添加继承的代码:
- import io
- import base64
- import logging
- from reportlab.pdfbase import pdfmetrics, ttfonts
- from reportlab.pdfgen import canvas
- from reportlab.lib.units import cm
- from PyPDF2 import PdfFileWriter, PdfFileReader
- from odoo import fields, models
- _logger = logging.getLogger(__name__)
- class IrHttp(models.AbstractModel):
- _inherit = 'ir.http'
- def binary_content(self, *args, **kwargs):
- status, headers, content = super(IrHttp, self).binary_content(*args, **kwargs)
- content_type = dict(headers).get('Content-Type')
- print ('------------content_type----------',content_type)
- if content_type == 'application/pdf':
- content = self.add_watermark(base64.b64decode(content))
- content = base64.b64encode(content)
- return status, headers, content
- def _get_watermark(self):
- """
- 获取水印文本:公司名称+当前日期
- :return:
- """
- return f'{self.env.company.name} {fields.Date.context_today(self)}'
- def _generate_watermark(self):
- """
- 生成水印
- :return:
- """
- # 水印文件临时存储路径:
- filename = f'E:\DEMO\watermark.pdf' #这是windows环境
# 水印文件临时存储路径
# filename = f'/tmp/watermark.pdf' #这是linux环境
- watermark = self._get_watermark()
- # 获取画布并修改原点坐标
- c = canvas.Canvas(filename)
- c.translate(1.5 * cm, -3 * cm)
- try:
- font_name = 'SimSun'
- # 从系统路径中引入中文字体(新宋)
- pdfmetrics.registerFont(ttfonts.TTFont('SimSun', 'SimSun.ttf'))
- except Exception as e:
- # 默认字体,不支持中文
- font_name = 'Helvetica'
- _logger.error(f'Register Font Error: {e}')
- # 设置字体及大小,旋转 -20 度并设置颜色和透明度
- c.setFont(font_name, 14)
- c.rotate(20)
- c.setFillColor('#27334C', 0.15)
- # 平铺写入水印
- print('watermark---------------', watermark)
- for i in range(0, 30, 6):
- for j in range(0, 35, 5):
- c.drawString(i * cm, j * cm, watermark)
- c.save()
- return filename
- def add_watermark(self, content):
- """
- 添加水印
- :param content:
- :return:
- """
- watermark = self._generate_watermark()
- pdf_input = PdfFileReader(io.BytesIO(content), strict=False)
- watermark = PdfFileReader(open(watermark, "rb"), strict=False)
- pdf_output = PdfFileWriter()
- page_count = pdf_input.getNumPages()
# 遍历要下载的 PDF 将它的每一页都和水印文件合并起来- for page_number in range(page_count):
- input_page = pdf_input.getPage(page_number)
- input_page.mergePage(watermark.getPage(0))
- pdf_output.addPage(input_page)
- stream = io.BytesIO()
- pdf_output.write(stream)
- data = stream.getvalue()
- return data
最后效果
本文来自:https://ruterly.com/2020/12/27/Odoo-Add-Watermark-to-PDF
odoo14里面给下载PDF附件加水印的更多相关文章
- C#使用iTextSharp给PDF文件加水印
给PDF添加水印,可以用iTextSharp. 步骤1:下载iTextSharp 步骤2:在项目中添加引用itextsharp.dll 步骤3:在程序中使用iTextSharp.text.pdf us ...
- OAF 中下载使用XML Publisher下载PDF附件
OAF doesn't readily expose the Controller Servlet's HttpRequest and HttpResponse objects so you need ...
- springboot为导出的pdf和excel加水印
相信很多小伙伴们在做导出pdf或者excel文件时会被要求在文件上加上水印,本篇博客就来讲讲如何为pdf和excel加水印. 导出pdf加水印 其实在导出pdf时加上水印并不难,因为itext提供了添 ...
- Java 添加、下载、读取PDF附件信息(基于Spire.Cloud.SDK for Java)
Spire.Cloud.SDK for Java提供了PdfAttachmentsApi接口添加附件addAttachment().下载附件downloadAttachment().获取附件信息get ...
- 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等
添加水印,并且增加权限 @Test public void addWaterMark() throws Exception{ String srcFile="D:\\work\\pdf\\w ...
- php中使用head进行二进制流输出,让用户下载PDF等附件的方法
http://blog.csdn.net/jallin2001/article/details/6872951 在PHP的手册中,有如下的方法,可以让用户方便的下载pdf或者其他类似的附件形式,不过这 ...
- 给现有的word和pdf加水印
iTextSharp简单生成pdf和操作pdf添加水印 给word加水印,利用的是aspose.words
- 怎么编辑PDF,如何给PDF加水印
在使用PDF文件的时候,往往会用到PDF编辑器来修改,那么,在使用PDF编辑器修改文件的时候,想要在文件中添加水印,这该怎么操作呢,不会的小伙伴可以看看下面的文章了哦,说不定就会了. 1.打开运行PD ...
- java 实现 PDF 加水印功能
使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 <dependency> <groupId>com.itextpdf</groupId> <a ...
随机推荐
- P5960 【模板】差分约束算法
题目描述 给出一组包含 $m$ 个不等式,有 $n$ 个未知数的形如: 的不等式组,求任意一组满足这个不等式组的解. 输入格式 第一行为两个正整数 $n,m$,代表未知数的数量和不等式的数量. 接下来 ...
- Java Spring boot 多商户入驻 外卖|跑腿|代驾 Uniapp版本
技术说明: 源码下载:https://www.yuanmahy.com/8357.html 开发环境:jdk1.8,mysql5.7,node 9.4,redis6.2,npm6.9 开发工具:前端使 ...
- 【NX二次开发】 删除面操作
录制修改封装删除面 DeleteFaces 1 #include <uf_defs.h> 2 #include <NXOpen/NXException.hxx> 3 #incl ...
- LCD1602液晶显示模块的单片机驱动深入详解之软件篇(AVR)
LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前 ...
- ECMAScript 2021 正式确认
ECMAScript 2021 主要包含内容: ECMAScript 2021 于2021年6月22日获得 ECMA International 的批准.ECMAScript 是标准化的 JavaSc ...
- Windows下安装kubectl及Node和Pod操作常用命令
kubernetes通过kube-apiserver作为整个集群管理的入口.Apiserver是整个集群的主管理节点,用户通过Apiserver配置和组织集群,同时集群中各个节点同etcd存储的交互也 ...
- Python基础之:Python的数据结构
目录 简介 列表 列表作为栈使用 列表作为队列使用 列表推导式 del 元组 集合 字典 循环 简介 不管是做科学计算还是编写应用程序,都需要使用到一些基本的数据结构,比如列表,元组,字典等. 本文将 ...
- 并发王者课-铂金8:峡谷幽会-看CyclicBarrier如何跨越重峦叠嶂
欢迎来到<并发王者课>,本文是该系列文章中的第21篇,铂金中的第8篇. 在上一篇文章中,我们介绍了CountDownLatch的用法.在协调多线程的开始和结束时,CountDownLatc ...
- 如何筛选CRM客户系统无效数据
企业将各个渠道获得的大量数据导入CRM系统之后,要如何筛选CRM客户系统无效数据?销售人员应该将更多的时间用于发掘潜在客户,而不是浪费时间来检索CRM数据.Zoho CRM能够呈现最有价值的客户,让销 ...
- Mybatis学习(1)开发环境搭建
什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML ...