PDF操作

作者: LCSan | 来源:发表于2020-05-05 12:55 被阅读0次
#encoding=utf-8
'''
Created on 2019年11月14日

@author: 瞌睡蟲子
'''
import fitz, os, re
import PyPDF2

def GetPagePic(pdfName,password=None,savePath=None, pageStart="begin", pageEnd="end"): 
    '''
    `提取PDF    
    `文件名    需要提取图像的PDF文件名
    `文件密码    PDF文件密码,如果没有密码则为null
    `保存文件名    提取后的文件名
    `页面范围    数组形式,[开始页,结束页],其中"begin"代表第一页,"end"代表最后一页,可以有如下形式["begin",9] 或者 ["begine","end"]
    '''
    # 打开pdf
    doc = fitz.open(pdfName);
    if password is not None:
        doc.authenticate(password);
    # 图片数
    pic_count=0;
    # 默认存pdf目录
    if not savePath:
        savePath = os.path.dirname(pdfName);
    # 文件名
    filName = os.path.basename(pdfName);
    filName = filName.split(".")[0];
    pageSize = [pageStart,pageEnd];
    pageSize=HandlePageSize(pageSize, doc.pageCount);
    for pg in pageSize:
        imglist = doc.getPageImageList(pg);
        for i in imglist:
            pic_count+=1;
            pix = fitz.Pixmap(doc, i[0]);
            fitz.Pixmap(fitz.csRGB, pix).writeImage("%s\%s_%d_%d.%s" % (savePath, filName,(pg+1), pic_count, "png"));
    doc.close();

def GetAllPic(pdfName,password=None,savePath=None,picType="png"):
    '''
    `提取文件中的图像    
    `文件名    需要提取图像的PDF文件名
    `文件密码    PDF文件密码,如果没有密码则为null
    `保存路径    保存图片的路径,图片按照PDF文件名_序号的形式保存
    `保存类型    保存图片文件的类型,支持PNG、JPG、BMP
    '''
    # 打开pdf
    doc = fitz.open(pdfName);
    if password is not None:
        doc.authenticate(password);
    # 图片数
    pic_count=0;
    # 默认存pdf目录
    if not savePath:
        savePath = os.path.dirname(pdfName);
    # 文件名
    filName = os.path.basename(pdfName);
    filName = filName.split(".")[0];
#     pageSize=HandlePageSize(pageSize, doc.pageCount);
    for pg in range(doc.pageCount):
        imglist = doc.getPageImageList(pg);
        for i in imglist:
            pic_count+=1;
            pix = fitz.Pixmap(doc, i[0]);
            fitz.Pixmap(fitz.csRGB, pix).writeImage("%s\%s_%d.%s" % (savePath, filName, pic_count, picType));
    doc.close();
    
    
    # 使用正则表达式来查找图片
    checkXO = r"/Type(?= */XObject)" 
    checkIM = r"/Subtype(?= */Image)"  
    
    # 打开pdf
    doc = fitz.open(pdfName);
    if password is not None:
        doc.authenticate(password);
    # 对象数
    lenXREF = doc._getXrefLength();
    # 图片数
    pic_count=0;
    # 默认存pdf目录
    if not savePath:
        savePath = os.path.dirname(pdfName);
    # 文件名
    filName = os.path.basename(pdfName);
    filName = filName.split(".")[0];
    
    # 遍历每一个对象
    for i in range(1, lenXREF):
        # 定义对象字符串
        text = doc._getXrefString(i);
        isXObject = re.search(checkXO, text);
        # 使用正则表达式查看是否是图片
        isImage = re.search(checkIM, text);
 
        # 如果不是对象也不是图片,则continue
        if not isXObject or not isImage:
            continue;
        pic_count += 1;
        # 根据索引生成图像
        pix = fitz.Pixmap(doc, i);
        # 根据pdf的路径生成图片的名称        
        fitz.Pixmap(fitz.csRGB, pix).writeImage("%s\%s_%d.%s" % (savePath, filName, pic_count, picType));
    pix = None;
    doc.close();
 
def GetPageText(pdfName,password=None, pageStart="begin", pageEnd="end"):
    '''
    `读取文本    
    `输出到    将提取的文本保存到变量(返回值)
    `文件名    需要读取文本的PDF文件名
    `文件密码    PDF文件密码,如果没有密码则为null
    `页面范围    数组形式,[开始页,结束页],其中"begin"代表第一页,"end"代表最后一页,可以有如下形式["begin",9] 或者 ["begine","end"]
    '''
    # 打开一个PDF文件,doc为Document类型,是一个包含每一页PDF文件的列表
    doc = fitz.open(pdfName);
    if password is not None:
        doc.authenticate(password);
    pageSize = [pageStart,pageEnd];
    pageSize=HandlePageSize(pageSize, doc.pageCount);
    pageContent=[];
    for pg in pageSize:
        pageContent.append(fitz.utils.getPageText(doc, pg).strip());
    return pageContent;
    doc.close();
     
def PageSaveToPic(pdfName,password=None,savePath=None, pageStart="begin", pageEnd="end"):
    '''
    `导出页码为图片    
    `文件名    需要导出成图像的PDF文件名
    `文件密码    PDF文件密码,如果没有密码则为null
    `保存文件名    保存图片的路径
    `导出页码    需要导出成图像的页码
    '''
    # 打开一个PDF文件,doc为Document类型,是一个包含每一页PDF文件的列表
    doc = fitz.open(pdfName);
    if password is not None:
        doc.authenticate(password);
    # 设置图片的旋转角度
    # 设置图片相对于PDF文件在X轴上的缩放比例
    trans = fitz.Matrix(2.0, 2.0).preRotate(0);
    # 默认存pdf目录
    if not savePath:
        savePath = os.path.dirname(pdfName);
    # 文件名
    filName = os.path.basename(pdfName);
    filName = filName.split(".")[0];
    pageSize = [pageStart,pageEnd];
    # 页码处理
    pageSize=HandlePageSize(pageSize, doc.pageCount);
    for pg in pageSize: 
        pm = fitz.utils.getPagePixmap(doc, pg, matrix=trans, alpha=False);
        pm.writeImage("%s\%s_%d.%s" % (savePath, filName, (pg+1), "png"));
    doc.close();
 
def PageCount(pdfName,password=None):
    '''
    `获取总页数    
    `输出到    将总页数保存到变量(返回值)
    `文件名    PDF文件名
    `文件密码    PDF文件密码,如果没有密码则为null
    '''
    # 打开一个PDF文件,doc为Document类型,是一个包含每一页PDF文件的列表
    doc = fitz.open(pdfName);
    if password is not None:
        doc.authenticate(password);
    pageCount = doc.pageCount
    doc.close();
    return pageCount;
     
def PdfMerge(pdfPath,saveName):
    '''
    `合并PDF    
    `文件列表    数组类型,需要合并的文件路径列表
    `保存文件名    合并后的文件名
    '''
    if type(pdfPath) == list and len(pdfPath)< 2:
        raise Exception('无法合并单个PDF文件');
    output = PyPDF2.PdfFileWriter()
    outputPages = 0    
    for pdf_file in pdfPath:
        f=open(pdf_file, "rb");
        # 读取源PDF文件
        inp = PyPDF2.PdfFileReader(f);
        # 获得源PDF文件中页面总数
        pageCount = inp.getNumPages();
        outputPages += pageCount;
        # 分别将page添加到输出output中
        for iPage in range(pageCount):
            output.addPage(inp.getPage(iPage));
    # 写入到目标PDF文件
    outputStream = open(saveName, "wb");
    output.write(outputStream);
    outputStream.close();

def HandlePageSize(pageSize, pageCount):
#     if type(pageSize) == int:
#         if pageSize < 1:
#             raise Exception('开始页码从1开始');
#         elif pageSize > pageCount:
#             raise Exception('开始页码必须小于结束页码');
#         return [pageSize-1];
    if type(pageSize) == list and len(pageSize) == 2:
        for i in range(len(pageSize)):
            temp=pageSize[i];
            if type(temp) == str:
                temp = temp.lower();
                if temp == "begin":
                    pageSize[i] = 1;
                elif temp == "end":
                    pageSize[i] = pageCount;
                else:
                    raise Exception('页码必须是数字');
            elif type(temp) == int:
                if temp < 1:
                    raise Exception('页码必须大于1');
            else:
                raise Exception('页码必须是数字');
        if pageSize[0] < 1:
            raise Exception('开始页码从1开始');
        elif pageSize[0] > pageCount:
            raise Exception('开始页码必须小于结束页码');
        if pageSize[1] > pageCount:
            pageSize[1] = pageCount;
        pageSize[0] = pageSize[0] - 1;
        return range(*tuple(pageSize));
    else:
        raise Exception('页码参数错误');
#             return [i-1 for i in pageSize];
#     if type(pageSize) == str and pageSize.lower() == "begin" :
#         return [0];
#     if type(pageSize) == str and pageSize.lower() == "end" :   
#         return [pageCount - 1];     
            
    
if __name__ == '__main__':
    print(type(0))
#     PdfMerge([r"C:\Users\Administrator\Desktop\aa\xxx.pdf",r"C:\Users\Administrator\Desktop\aa\xxxxxx.pdf"], r"C:\Users\Administrator\Desktop\bb\bb.pdf");
#     PageSaveToPic(r"C:\Users\Administrator\Desktop\aa\xxx.pdf",savePath=r"C:\Users\Administrator\Desktop\bb", pageSize=["begin","end"]);
#     GetPagePic(r"C:\Users\Administrator\Desktop\aa\xxx.pdf", savePath=r"C:\Users\Administrator\Desktop\bb", pageSize=["begin","end"])
#     GetAllPic(r"C:\Users\Administrator\Desktop\aa\xxx.pdf",savePath=r"C:\Users\Administrator\Desktop\bb",picType="bmp");
#     text=GetPageText(r"C:\Users\Administrator\Desktop\aa\xxx.pdf", pageSize=[5,1]);
#     print(text);
#     print(PageCount(r"C:\Users\Administrator\Desktop\aa\xxx.pdf"));
#     print(HandlePageSize(1,100));
#     print(HandlePageSize(["begin","end"],100));
#     print(HandlePageSize(["end","begin"],100));
#     print(HandlePageSize([1,3,4,"end",6],100));
    

相关文章

网友评论

    本文标题:PDF操作

    本文链接:https://www.haomeiwen.com/subject/xmkmghtx.html