将pdf转成长图片

WPS有这个功能,但WPS的显示效果比较差,且有水印。如果要效果好点,必须要会员。

所以就自己写了个脚本,分享给有需要的人。

话不多说,直接上代码。有疑问的同学可留言区交流。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import fitz  # 依赖 pip install PyMuPDF
import cv2
import numpy as np

def pdf2png(pdffile):
    try:
        imagePath = os.path.join(os.getcwd(), "image")
        pdfDoc = fitz.open(pdffile)
        tar_h = 0  # 目标图片的总高度
        for pg in range(pdfDoc.page_count):
            # 获取所有的图片,并以此计算出大图片的总高度
            page = pdfDoc[pg]
            # 此处若是不做设置,默认图片大小为:792X612, dpi=96
            pix = page.get_pixmap(dpi=300, alpha=False)
            tar_h += pix.height

        src = pdfDoc[0].get_pixmap(dpi=300, alpha=False)  # 生成第一个图片
        tar_pix = fitz.Pixmap(src.colorspace, (0, 0, src.width, tar_h), src.alpha)  # 生成目标图片,高等于所有图片的总高,宽等于一张图片的宽度
        for pg in range(pdfDoc.page_count):
            page = pdfDoc[pg]
            src = page.get_pixmap(dpi=300, alpha=False)
            src.set_origin(0, src.height * pg)
            tar_pix.copy(src, src.irect)  # copy input to new loc

        pdffile = os.path.basename(pdffile)
        if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
            os.makedirs(imagePath)  # 若图片文件夹不存在就创建
        print(">>> 准备保存的文件名为:",os.path.join(imagePath , pdffile.replace("pdf", "png")))
        tar_pix.save(os.path.join(imagePath , pdffile.replace("pdf", "png")))  # 将图片写入指定的文件夹内

    except IOError:
        print('pdf转png失败')
    else:
        print("pdf转png成功")
        return os.path.join(imagePath , pdffile.replace("pdf", "png"))

def delwhiteline(imgfile):
    delta = 75 # 最大留白 74pix 行
    # imgray = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)  # 读取灰度图像
    # 由于cv2文件名称中不允许有中文,所以用numpy先读取数据再转化处理
    im = cv2.imdecode(np.fromfile(imgfile, dtype=np.uint8),cv2.IMREAD_COLOR)

    imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    (row, col) = imgray.shape
    whiteLineIndex = [] # 记录空白行的像素行号
    whiteLineFlag = False # 发现空白行标记

    #准备删除空行
    # 将每行、每列的灰度值进行相加
    row_gray = np.sum(imgray,axis=1)

    for r in range(1,row,delta):
        if np.sum(row_gray[r:r+delta]) == delta*col*255:
            # 表明找到了空行
            whiteLineFlag = True
        else:
            continue

        i = 0
        while(whiteLineFlag):
            if r+delta + i < row and row_gray[r+delta + i] == col*255:
                whiteLineIndex.append(r+delta + i)
                i = i + 1
            else:
                whiteLineFlag = False

    whiteLineIndex = list(set(whiteLineIndex))
    # 删除空白行
    new_img=np.delete(im,whiteLineIndex,axis=0)

    # 准备删除空列
    delta = 95 # 图片两边只有95px为空
    col_gray = np.sum(imgray,axis=0)
    #先取到开始的空列
    whiteLineFlag = True
    whiteLineIndex.clear() # 清空之前的索引
    i = 0
    while (whiteLineFlag):
        if delta + i < col and col_gray[delta + i] == row * 255:
            whiteLineIndex.append(delta + i)
            i = i + 1
        else:
            whiteLineFlag = False
    # 先取到末尾的空列
    whiteLineFlag = True
    i = 0
    while (whiteLineFlag):
        if col - delta - i > 0 and col_gray[col - delta - i] == row * 255:
            whiteLineIndex.append(col - delta - i)
            i = i + 1
        else:
            whiteLineFlag = False
    # 删除空白列
    new_img=np.delete(new_img,whiteLineIndex,axis=1)

    return new_img


if __name__ == '__main__':
    # 获取到当前文件夹下的所有pdf文件
    all_file = []
    currentDir = os.getcwd()
    for f in os.listdir(currentDir):  # listdir返回文件中所有目录
        f_name = os.path.join(currentDir, f)
        if os.path.isfile(f_name):
            if f.endswith(".pdf"):
                all_file.append(f_name)

    for docfile in all_file:
        print(">>> 准备处理文件:\n ",docfile)
        # 由pdf生成png文件
        fileobj = pdf2png(docfile)
        # 删除png文件中的空白
        new_img = delwhiteline(fileobj)

        if (os.path.exists(fileobj)):
            os.remove(fileobj)

        #cv2.imwrite("result.jpg", new_img)
        cv2.imencode('.png', new_img)[1].tofile(fileobj) # 解决cv2不能保存为中文名的问题




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值