zoukankan      html  css  js  c++  java
  • python 图片添加水印 pdf 添加水印

     1 # /usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # 本示例使用两个第三方库来实现为PDF文件添加文字水印
     4 # 这两个库是pyPdf和reportlab
     5 # 使用的Python版本是Python 2.7
     6 # http://pybrary.net/pyPdf
     7 # http://www.reportlab.com
     8 
     9 import os
    10 # 库文件的导入
    11 from pyPdf import PdfFileWriter, PdfFileReader
    12 from reportlab.pdfgen import canvas
    13 
    14 from PIL import Image, ImageDraw, ImageFont
    15 import os
    16 
    17 # 指定要使用的字体和大小;/Library/Fonts/是macOS字体目录;Linux的字体目录是/usr/share/fonts/
    18 font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf', 45)
    19 
    20 
    21 # image: 图片  text:要添加的文本 font:字体
    22 def add_text_to_image(image_name, text, font=font):
    23     image = Image.open(image_name)
    24     rgba_image = image.convert('RGBA')
    25     text_overlay = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))
    26     image_draw = ImageDraw.Draw(text_overlay)
    27     text_size_x, text_size_y = image_draw.textsize(text, font=font)
    28     # 设置文本文字位置
    29     print(rgba_image)
    30     # text_xy = (rgba_image.size[0] - text_size_x, rgba_image.size[1] - text_size_y)  #底部
    31     # text_xy = ((rgba_image.size[0] - text_size_x) / 2, (rgba_image.size[1] - text_size_y) / 2)  # 中间
    32     text_xy = ((rgba_image.size[0] - text_size_x), 0)  # 中间
    33     # 设置文本颜色和透明度
    34     # image_draw.text(text_xy, text, font=font, fill=(76, 234, 124, 180))
    35     image_draw.text(text_xy, text, font=font, fill=(0, 0, 0))
    36 
    37     image_with_text = Image.alpha_composite(rgba_image, text_overlay)
    38 
    39     return image_with_text
    40 
    41 def add_mark(info_name, text):
    42     print info_name
    43     # 使用reportlab来创建一个PDF文件来作为一个水印文件
    44     c = canvas.Canvas("watermark.pdf")
    45     c.setFont("Courier", 35)
    46 
    47     # 设置水印文字的灰度
    48     c.setFillGray(0.0, 1)
    49 
    50     # 设置水印文件,并将文字倾斜45度角
    51     c.saveState()
    52     c.translate(280, 750)
    53     c.rotate(0)
    54     c.drawCentredString(0, 0, text)
    55     c.restoreState()
    56     c.save()
    57 
    58     output = PdfFileWriter()
    59     input1 = PdfFileReader(file(info_name, 'rb'))
    60     water = PdfFileReader(file('watermark.pdf', 'rb'))
    61 
    62     # 获取pdf文件的页数
    63     pageNum = input1.getNumPages()
    64     print pageNum
    65     # 给每一页打水印
    66     for i in range(pageNum):
    67         page = input1.getPage(i)
    68         page.mergePage(water.getPage(0))
    69         output.addPage(page)
    70     return output
    71 
    72 def run():
    73     os.mkdir("results")
    74     file_name = "info"
    75     files = os.listdir(file_name)
    76     r = 0
    77     for t_file in files:
    78         file_all_img = file_name + os.sep + t_file
    79         if os.path.isfile(file_all_img):
    80             continue
    81         for file_img in os.listdir(file_all_img):
    82             file_img_all_img_all = file_all_img + os.sep + file_img
    83             if file_img_all_img_all.endswith('pdf'):
    84                 out_put = add_mark(file_img_all_img_all, t_file)
    85                 outStream = file('results' + os.sep + '{}.pdf'.format(r), 'wb')
    86                 out_put.write(outStream)
    87                 outStream.close()
    88                 os.remove("watermark.pdf")
    89             else:
    90                 im_after = add_text_to_image(image_name=file_img_all_img_all, text=t_file)
    91                 im_after.save("results/{}.png".format(r))
    92             r += 1
    93 
    94 
    95 
    96 if __name__ == '__main__':
    97     run()
    View Code
  • 相关阅读:
    进程、线程和协程的图解
    Python多线程的原理与实现
    Python多进程原理与实现
    python面试题-1
    数据库事务隔离级别--读未提交,读已提交,重复读,序列化
    java--浅谈线程(二、线程的方法和状态)
    java--浅谈线程(一简单介绍)
    类加载机制--浅谈
    JSP/Servlet Web 学习笔记 DayThree
    JSP/Servlet Web 学习笔记 DayThree —— 实现一个登陆小界面
  • 原文地址:https://www.cnblogs.com/kayb/p/10846341.html
Copyright © 2011-2022 走看看