python_pdf常规使用

目录

1. 加水印

2. 将pdf转成一张张图片 

 3. 多张图片转成一个pdf

 4. 多个pdf合并成一个pdf

 附加


1. 加水印

给pdf文件加自定义水印

代码中 msyn.ttf 需要下载下来,然后在代码中指向存放的位置

import os,datetime,fitz
# fitz ==> pip install PyMuPDF==1.18.9
from PyPDF2 import PdfFileReader,PdfFileWriter
from reportlab.lib.units import cm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('msyh','./msyh.ttf'))

以上是python操作pdf需要用到的包

创建水印的代码:

# 创建水印
# content: 字符串列表
def create_watermark00(pre_dir,content):
    print(content)
    '''创建水印'''
    # 默认大小为 21cm*29.7cm
    file_name = pre_dir+'mark.pdf'
    c = canvas.Canvas(file_name,pagesize=(30*cm,30*cm))
    # 移动坐标原点(坐标系左下为(0,0))
    c.translate(10*cm,5*cm)

    # 设置字体
    c.setFont('msyh',20)
    # 指定描边的颜色
    c.setStrokeColorRGB(0,0,0)
    # 指定填充颜色
    c.setFillColorRGB(0,0,0,0.2)
    # 旋转45度,坐标系被旋转
    c.rotate(30)
    # 画几个文本,注意坐标系旋转的影响
    for i in range(5):
        for j in range(10):
            a = 20*(i-1)
            b = 5*(j-2)
            for item_i,item_txt in enumerate(content):
                c.drawString((a+item_i)*cm,(b-item_i)*cm,item_txt)
            # c.drawString(a*cm,b*cm,content)
    c.setFillAlpha(0.1)
    c.save()
    return file_name

添加水印的代码:

# 给pdf添加水印
def add_watermark(pdf_file_in,pdf_file_mark,pdf_file_out):
    pdf_output = PdfFileWriter()
    input_stream = open(pdf_file_in,'rb')
    pdf_input = PdfFileReader(input_stream,strict=False)
    # 获取pdf文件的页数
    pageNum = pdf_input.getNumPages()
    # 读入水印pdf文件
    pdf_watermark = PdfFileReader(open(pdf_file_mark,'rb'),strict=False)
    # 给每一页打水印
    for i in range(pageNum):
        page = pdf_input.getPage(i)
        page.mergePage(pdf_watermark.getPage(0))
        page.compressContentStreams()
        pdf_output.addPage(page)
        pdf_output.write(open(pdf_file_out,'wb'))
    pass

使用:

if __name__ == '__main__':
    pdf_file_in = r'E:/temp003/牧原股份_分析.pdf'
    pdf_file_out = r'E:/temp003/temp_mark.pdf'
    w_list = ['人生若只如初见','何事秋风悲画扇']
    pdf_file_mark = create_watermark00(r'E:/temp003/',w_list)
    add_watermark(pdf_file_in,pdf_file_mark,pdf_file_out)

加水印前:

 加水印后: 

2. 将pdf转成一张张图片 

pdf有多少页就转成多少张图片

# 将pdf转成图片
def pdf_2_imgs(pdfPath, imagePath):
    startTime_pdf2img = datetime.datetime.now()  # 开始时间

    print("imagePath=" + imagePath)
    pdfDoc = fitz.open(pdfPath)
    for pg in range(pdfDoc.pageCount):
        page = pdfDoc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
        # 此处若是不做设置,默认图片大小为:792X612, dpi=96
        zoom_x = 1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)
        zoom_y = 1.33333333
        mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pix = page.getPixmap(matrix=mat, alpha=False)

        if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
            os.makedirs(imagePath)  # 若图片文件夹不存在就创建

        pix.writePNG(imagePath + '/' + 'images_%s.png' % pg)  # 将图片写入指定的文件夹内

    endTime_pdf2img = datetime.datetime.now()  # 结束时间
    print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)

使用:

if __name__ == '__main__':
    pdf_path = r'E:/temp003/temp_mark.pdf'
    pic_dir = r'E:/temp003/pic/'
    pdf_2_imgs(pdf_path,pic_dir)

pdf有42页内容

 转成42张图片

 3. 多张图片转成一个pdf

# 将图片文件前后顺序用数字命名
def imgs_2_pdf(source_folder,pdfPath):
    doc = fitz.open()
    file_list = os.listdir(source_folder)
    file_map = {}
    for item in file_list:
        item_arr = item.split('.')
        file_map[item_arr[0]] = item
        pass
    for i in range(len(file_list)):
        img = source_folder + file_map[str(i)]
        imgdoc = fitz.open(img)  # 打开图片
        pdfbytes = imgdoc.convertToPDF()  # 使用图片创建单页的 PDF
        imgpdf = fitz.open("pdf", pdfbytes)
        doc.insertPDF(imgpdf)  # 将当前页插入文档
    doc.save(pdfPath)  # 保存pdf文件
    doc.close()

使用:

if __name__ == '__main__':
    img_dir = r'E:/temp003/pic/'
    pdf_path = r'E:/temp003/pic_after.pdf'
    imgs_2_pdf(img_dir,pdf_path)

图片的名称需要按照前后顺序从0开始命名

 

 4. 多个pdf合并成一个pdf

# 合并多个pdf文件成一个文件
def merge_pdfs_2_one(file_path,out_file):
    output = PdfFileWriter()
    outputPages = 0
    pdf_fileName = getFileName(file_path)

    if pdf_fileName:
        for pdf_file in pdf_fileName:
            # 读取源pdf文件
            input = PdfFileReader(open(pdf_file,'rb'))
            pageCount = input.getNumPages()
            outputPages += pageCount

            # 分别将page添加到输出output中
            for iPage in range(pageCount):
                output.addPage(input.getPage(iPage))
                pass
        print('合并后总页数',outputPages)
        # 写入到目标pdf文件
        outputStream = open(os.path.join(file_path,out_file),'wb')
        output.write(outputStream)
        outputStream.close()
    else:
        print('没有可以合并的pdf文件')
        pass
    pass

# 使用os模块的walk函数,搜索出指定目录下的全部PDF文件
# 获取同一目录下的所有PDF文件的绝对路径
def getFileName(filedir):

    file_list = [os.path.join(root, filespath) \
                 for root, dirs, files in os.walk(filedir) \
                 for filespath in files \
                 if str(filespath).endswith('pdf')
                 ]
    return file_list if file_list else []

使用:

if __name__ == '__main__':
    file_path = r'E:/temp003/temp/'
    out_file_name = r'E:/temp003/merge_example.pdf'
    merge_pdfs_2_one(file_path,out_file_name)
    pass

合并前:

合并后:

 

 附加

msyh.ttf下载地址

链接:https://pan.baidu.com/s/1IBVyKi4prejEtHFbMCuVhw 
提取码:urfi

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值