• 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()

    结果如下:

  • 相关阅读:
    Nginx使用
    MySQL 分区
    php PDO预处理
    php
    php
    linux 下编译安装MySQL
    php 工厂模式
    MySQL 权限管理
    hadoop集群安装20181016(20111130:前面太忙,没有写完,后面继续)
    JavaScript函数参数翻转——连接多个数组——zip、zipwith
  • 原文地址:https://www.cnblogs.com/yangjian319/p/9169421.html
Copyright © 2020-2023  润新知