Python PDF 加水印

今天药忘吃喽~ 2024-03-24 17:41 175阅读 0赞

Python PDF 加水印

  1. from PyPDF2 import PdfWriter,PdfReader
  2. from reportlab.lib.units import cm
  3. from reportlab.pdfgen import canvas
  4. import reportlab.pdfbase.ttfonts
  5. from reportlab.pdfbase import pdfmetrics
  6. import os
  7. basedir=os.path.dirname(os.path.abspath(__file__))
  8. def create_watermark(content):
  9. """水印信息"""
  10. # 默认大小为21cm*29.7cm
  11. file_name = os.path.join(basedir,"../../media/mark.pdf")
  12. c = canvas.Canvas(file_name, pagesize=(30 * cm, 30 * cm))
  13. # 移动坐标原点(坐标系左下为(0,0))
  14. c.translate(10 * cm, 5 * cm)
  15. try:
  16. # 注册中文字体
  17. pdfmetrics.registerFont(reportlab.pdfbase.ttfonts.TTFont('yahei', '微软雅黑.ttf'))
  18. c.setFont('yahei',20)
  19. except:
  20. # 设置字体
  21. c.setFont("Helvetica", 30)
  22. # 指定描边的颜色
  23. c.setStrokeColorRGB(0, 1, 0)
  24. # 指定填充颜色
  25. c.setFillColorRGB(0, 0, 222,0.2)
  26. # 旋转45度,坐标系被旋转
  27. c.rotate(30)
  28. # 指定填充颜色
  29. # c.setFillColorRGB(0, 0, 0, 0.1)
  30. # 设置透明度,1为不透明
  31. c.setFillAlpha(0.1)
  32. # 画几个文本,注意坐标系旋转的影响
  33. for i in range(5):
  34. for j in range(10):
  35. a = 10 * (i - 1)
  36. b = 5 * (j - 2)
  37. c.drawString(a * cm, b * cm, content)
  38. c.setFillAlpha(0.1)
  39. # 关闭并保存pdf文件
  40. c.save()
  41. return file_name
  42. def add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):
  43. """把水印添加到pdf中"""
  44. pdf_output = PdfWriter()
  45. input_stream = open(pdf_file_in, 'rb')
  46. pdf_input = PdfReader(input_stream, strict=False)
  47. # 获取PDF文件的页数
  48. pageNum = len(pdf_input.pages)
  49. # 读入水印pdf文件
  50. pdf_watermark = PdfReader(open(pdf_file_mark, 'rb'), strict=False)
  51. # 给每一页打水印
  52. for i in range(pageNum):
  53. page = pdf_input.pages[i]
  54. page.merge_page(pdf_watermark.pages[0])
  55. page.compress_content_streams() # 压缩内容
  56. pdf_output.add_page(page)
  57. pdf_output.write(open(pdf_file_out, 'wb'))

发表评论

表情:
评论列表 (有 0 条评论,175人围观)

还没有评论,来说两句吧...

相关阅读

    相关 uniApp图片

    这个代码直接拿走运行没啥大问题,但是,建议开发的时候,如果遇到加水印,别多选图片,没找到什么原因,就是绘制的不理想,一张一张来,可以 <template>