依赖包:pip install reportlab

Odoo 中附件的下载会经过 ir.http 的 def binary_content() 方法获取附件内容等必要信息,

所以我们需要继承 ir.http 模型并重写 binary_content 方法,对 PDF 类型的附件添加水印,

在 [models.py](http://models.py) 中添加继承的代码:

  1. import io
  2. import base64
  3. import logging
  4. from reportlab.pdfbase import pdfmetrics, ttfonts
  5. from reportlab.pdfgen import canvas
  6. from reportlab.lib.units import cm
  7. from PyPDF2 import PdfFileWriter, PdfFileReader
  8.  
  9. from odoo import fields, models
  10.  
  11. _logger = logging.getLogger(__name__)
  12.  
  13. class IrHttp(models.AbstractModel):
  14. _inherit = 'ir.http'
  15.  
  16. def binary_content(self, *args, **kwargs):
  17. status, headers, content = super(IrHttp, self).binary_content(*args, **kwargs)
  18. content_type = dict(headers).get('Content-Type')
  19. print ('------------content_type----------',content_type)
  20. if content_type == 'application/pdf':
  21. content = self.add_watermark(base64.b64decode(content))
  22. content = base64.b64encode(content)
  23.  
  24. return status, headers, content
  25.  
  26. def _get_watermark(self):
  27. """
  28. 获取水印文本:公司名称+当前日期
  29. :return:
  30. """
  31. return f'{self.env.company.name} {fields.Date.context_today(self)}'
  32.  
  33. def _generate_watermark(self):
  34. """
  35. 生成水印
  36. :return:
  37. """
  38. # 水印文件临时存储路径:
  39. filename = f'E:\DEMO\watermark.pdf' #这是windows环境
  1. # 水印文件临时存储路径
  2. # filename = f'/tmp/watermark.pdf' #这是linux环境


  1. watermark = self._get_watermark()
  2. # 获取画布并修改原点坐标
  3. c = canvas.Canvas(filename)
  4. c.translate(1.5 * cm, -3 * cm)
  5.  
  6. try:
  7. font_name = 'SimSun'
  8. # 从系统路径中引入中文字体(新宋)
  9. pdfmetrics.registerFont(ttfonts.TTFont('SimSun', 'SimSun.ttf'))
  10. except Exception as e:
  11. # 默认字体,不支持中文
  12. font_name = 'Helvetica'
  13. _logger.error(f'Register Font Error: {e}')
  14.  
  15. # 设置字体及大小,旋转 -20 度并设置颜色和透明度
  16. c.setFont(font_name, 14)
  17. c.rotate(20)
  18. c.setFillColor('#27334C', 0.15)
  19. # 平铺写入水印
  20. print('watermark---------------', watermark)
  21. for i in range(0, 30, 6):
  22. for j in range(0, 35, 5):
  23. c.drawString(i * cm, j * cm, watermark)
  24. c.save()
  25. return filename
  26.  
  27. def add_watermark(self, content):
  28. """
  29. 添加水印
  30. :param content:
  31. :return:
  32. """
  33. watermark = self._generate_watermark()
  34. pdf_input = PdfFileReader(io.BytesIO(content), strict=False)
  35. watermark = PdfFileReader(open(watermark, "rb"), strict=False)
  36. pdf_output = PdfFileWriter()
  37. page_count = pdf_input.getNumPages()
    # 遍历要下载的 PDF 将它的每一页都和水印文件合并起来
  38. for page_number in range(page_count):
  39. input_page = pdf_input.getPage(page_number)
  40. input_page.mergePage(watermark.getPage(0))
  41. pdf_output.addPage(input_page)
  42. stream = io.BytesIO()
  43. pdf_output.write(stream)
  44. data = stream.getvalue()
  45. return data

最后效果

本文来自:https://ruterly.com/2020/12/27/Odoo-Add-Watermark-to-PDF

odoo14里面给下载PDF附件加水印的更多相关文章

  1. C#使用iTextSharp给PDF文件加水印

    给PDF添加水印,可以用iTextSharp. 步骤1:下载iTextSharp 步骤2:在项目中添加引用itextsharp.dll 步骤3:在程序中使用iTextSharp.text.pdf us ...

  2. OAF 中下载使用XML Publisher下载PDF附件

    OAF doesn't readily expose the Controller Servlet's HttpRequest and HttpResponse objects so you need ...

  3. springboot为导出的pdf和excel加水印

    相信很多小伙伴们在做导出pdf或者excel文件时会被要求在文件上加上水印,本篇博客就来讲讲如何为pdf和excel加水印. 导出pdf加水印 其实在导出pdf时加上水印并不难,因为itext提供了添 ...

  4. Java 添加、下载、读取PDF附件信息(基于Spire.Cloud.SDK for Java)

    Spire.Cloud.SDK for Java提供了PdfAttachmentsApi接口添加附件addAttachment().下载附件downloadAttachment().获取附件信息get ...

  5. 使用iText对pdf做权限的操作(不允许修改,不允许复制,不允许另存为),并且加水印等

    添加水印,并且增加权限 @Test public void addWaterMark() throws Exception{ String srcFile="D:\\work\\pdf\\w ...

  6. php中使用head进行二进制流输出,让用户下载PDF等附件的方法

    http://blog.csdn.net/jallin2001/article/details/6872951 在PHP的手册中,有如下的方法,可以让用户方便的下载pdf或者其他类似的附件形式,不过这 ...

  7. 给现有的word和pdf加水印

    iTextSharp简单生成pdf和操作pdf添加水印 给word加水印,利用的是aspose.words

  8. 怎么编辑PDF,如何给PDF加水印

    在使用PDF文件的时候,往往会用到PDF编辑器来修改,那么,在使用PDF编辑器修改文件的时候,想要在文件中添加水印,这该怎么操作呢,不会的小伙伴可以看看下面的文章了哦,说不定就会了. 1.打开运行PD ...

  9. java 实现 PDF 加水印功能

    使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 <dependency> <groupId>com.itextpdf</groupId> <a ...

随机推荐

  1. P5960 【模板】差分约束算法

    题目描述 给出一组包含 $m$ 个不等式,有 $n$ 个未知数的形如: 的不等式组,求任意一组满足这个不等式组的解. 输入格式 第一行为两个正整数 $n,m$,代表未知数的数量和不等式的数量. 接下来 ...

  2. Java Spring boot 多商户入驻 外卖|跑腿|代驾 Uniapp版本

    技术说明: 源码下载:https://www.yuanmahy.com/8357.html 开发环境:jdk1.8,mysql5.7,node 9.4,redis6.2,npm6.9 开发工具:前端使 ...

  3. 【NX二次开发】 删除面操作

    录制修改封装删除面 DeleteFaces 1 #include <uf_defs.h> 2 #include <NXOpen/NXException.hxx> 3 #incl ...

  4. LCD1602液晶显示模块的单片机驱动深入详解之软件篇(AVR)

    LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前 ...

  5. ECMAScript 2021 正式确认

    ECMAScript 2021 主要包含内容: ECMAScript 2021 于2021年6月22日获得 ECMA International 的批准.ECMAScript 是标准化的 JavaSc ...

  6. Windows下安装kubectl及Node和Pod操作常用命令

    kubernetes通过kube-apiserver作为整个集群管理的入口.Apiserver是整个集群的主管理节点,用户通过Apiserver配置和组织集群,同时集群中各个节点同etcd存储的交互也 ...

  7. Python基础之:Python的数据结构

    目录 简介 列表 列表作为栈使用 列表作为队列使用 列表推导式 del 元组 集合 字典 循环 简介 不管是做科学计算还是编写应用程序,都需要使用到一些基本的数据结构,比如列表,元组,字典等. 本文将 ...

  8. 并发王者课-铂金8:峡谷幽会-看CyclicBarrier如何跨越重峦叠嶂

    欢迎来到<并发王者课>,本文是该系列文章中的第21篇,铂金中的第8篇. 在上一篇文章中,我们介绍了CountDownLatch的用法.在协调多线程的开始和结束时,CountDownLatc ...

  9. 如何筛选CRM客户系统无效数据

    企业将各个渠道获得的大量数据导入CRM系统之后,要如何筛选CRM客户系统无效数据?销售人员应该将更多的时间用于发掘潜在客户,而不是浪费时间来检索CRM数据.Zoho CRM能够呈现最有价值的客户,让销 ...

  10. Mybatis学习(1)开发环境搭建

    什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML ...