zoukankan      html  css  js  c++  java
  • python处理数据(二)

     处理PDF文件

    PyPDF2简介

    作为 PDF 工具包构建的纯 python 库。 它可以:
    提取文档信息(标题,作者,... ...)
    一页一页地分割文件
    一页一页地合并文件
    裁剪页面
    将多个页面合并成一个页面
    加密和解密 PDF 文件
    通过使用纯 Python,它应该在任何 Python 平台上运行,而不需要依赖外部库。 它也可以完全使用 StringIO 对象而不是文件流,允许内存中的 PDF 操作。 因此,对于管理或操作 pdf 文档的网站来说,它是一个有用的工具。

    import codecs
    
    import PyPDF2
    import os
    
    files = list()  # 建立一个存放pdf文件的列表
    for fileName in os.listdir("book"):  # 遍历之前生成的pdf所在的文件夹
        if fileName.endswith(".pdf"):    # 找出以.pdf结尾的文件
            files.append(fileName)       # 将查找出来的pdf文件放进files列表中
    
    newFiles = sorted(files, key=lambda d: int(d.split(".pdf")[0]))   # 对列表中的文件进行排序
    print(newFiles)
    
    
    os.chdir("book")
    pdfWriter = PyPDF2.PdfFileWriter()#生成一个空白的pdf文件
    for item in newFiles:
        pdfReader = PyPDF2.PdfFileReader(open(item, "rb"))   # 以只读的方式依次打开每个pdf
        for page in range(pdfReader.numPages):  # 读取pdf有多少页
            pdfWriter.addPage(pdfReader.getPage(page))  # 将打开的pdf文件内容一页一页的复制到空白pdf文件里面pdfWriter
    
    with codecs.open("books.pdf", "wb") as f:  # 生成books.pdf文件
        pdfWriter.write(f)    # 将复制的内容写入到books.pdf文件中

    最后生成一个pdf文件,即books.pdf,包含之前所有的章节的内容。

    处理图片


    图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,如果你是python2.x,可以通过以下地址进行下载:http://www.pythonware.com/products/pil/index.htm,找到相对应的版本进行下载就可以了。
    注意:PIL模块在python3.x中已经替换成pillow模块,文档地址:http://pillow.readthedocs.io/en/latest/,直接使用pip3 install pillow即可安装模块,导入时使用from PIL import Image。

    安装模块

    pip install pillow

    例子:

    from PIL import Image
    image = Image.open("test.jpg")
    print(image.format, image.size, image.mode)  # 打印出图片格式、尺寸、模式
    image.show()          # 把图片显示出来

    结果如下:

    Image的三个属性:

    format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。
    size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。
    mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。
    Image的方法介绍:
    show():显示最近加载的图像
    open(infilename): 打开文件
    save(outfilename):保存文件
    crop((left, upper, right, lower)):从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。

    #image的方法
    #image.show()
    #image.open(file)
    #image.save(outputfile)
    #image.crop(left, upper, right, lower) # 抠图
    
    # Image的几何处理:
    # out = im.resize((128, 128))                     # 调整图片大小
    # out = im.rotate(45)                             # 逆时针旋转 45 度角。
    # out = im.transpose(Image.FLIP_LEFT_RIGHT)       # 左右对换。
    # out = im.transpose(Image.FLIP_TOP_BOTTOM)       # 上下对换。
    # out = im.transpose(Image.ROTATE_90)             # 旋转 90 度角。
    # out = im.transpose(Image.ROTATE_180)            # 旋转 180 度角。
    # out = im.transpose(Image.ROTATE_270)            # 旋转 270 度角。

     抠图,把头像抠出来

    from PIL import Image
    image = Image.open("test.jpg")
    
    cutjpg = image.crop((320, 65, 460, 220))
    cutjpg.show()

    结果如下:

     把头像翻转180度

    from PIL import Image
    image = Image.open("test.jpg")
    position = (320, 65, 460, 220)
    cutjpg = image.crop(position).transpose(Image.ROTATE_180)
    image.paste(cutjpg, position)
    image.show()

    结果如下:

     把图片缩小

    from PIL import Image
    image = Image.open("test.jpg")
    position = (320, 65, 460, 220)
    cutjpg = image.crop(position).transpose(Image.ROTATE_180)
    image.paste(cutjpg, position)
    
    (x, y) = image.size
    newx = 30
    newy = int(y*newx/x)
    newimage = image.resize((newx, newy))
    newimage.show()

    结果如下:

     生成验证码

    import random
    import string
    
    from PIL import Image, ImageFont, ImageDraw, ImageFilter
    
    # 字体的位置,不同版本的系统会有不同
    font_path = "msyh.ttf"
    # 生成几位数的验证码
    number = 4
    # 生成验证码图片的高度和宽度
    size = (100, 30)
    # 背景颜色,默认是白色
    bgcolor = (255, 255, 255)
    # 字体颜色,默认是蓝色
    fontcolor = (0, 0, 255)
    # 干扰线颜色,默认是红色
    linecolor = (255, 0, 0)
    # 是否要加入干扰线
    draw_line = True
    # 加入干扰线条数的上下限
    line_number = 30
    
    
    #生成一个随机字符串
    
    def getNumber():
        source = list(string.ascii_letters) + list(string.digits)
        return "".join(random.sample(source, number))
    
    #绘制干扰线
    def getLine(draw, width, height):
        begin = random.randint(0, width), random.randint(0, height)
        end  = random.randint(0, width), random.randint(0, height)
        draw.line([begin, end], fill=linecolor)
    
    def getCode():
        width, height = size
        image = Image.new("RGBA", size, bgcolor)
        font = ImageFont.truetype(font_path, 25)
        draw = ImageDraw.Draw(image)
        text = getNumber()
        font_width, font_height = font.getsize(text)
        draw.text(((width - font_width) / 2, (height - font_height) / 2), text, font=font, fill=fontcolor)  # 填充字符串
        if draw_line:
            for i in range(line_number):
                getLine(draw, width, height)
    
        # image = image.transform((width + 20, height + 10), Image.AFFINE, (1, -0.3, 0, -0.1, 1, 0), Image.BILINEAR)  # 创建扭曲
        image = image.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 滤镜,边界加强
        image.save('idencode.png')  # 保存验证码图片
        # image.show()
    if __name__ == '__main__':
        getCode()

    结果如下:

  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/yangjian319/p/9169421.html
Copyright © 2011-2022 走看看