批量拆分pdf脚本

这篇博客介绍了两种处理PDF的方法。首先,使用Selenium和PDF在线拆分网站进行文件上传和下载,但由于网站的反爬机制,效率低下。然后,通过PyPDF2库实现本地对PDF的拆分,提高了效率和稳定性。该脚本读取参数,遍历指定文件夹中的PDF,将其按页拆分并保存到新目录下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路记录

原先思路

利用在线的pdf拆分网站,进行上传文件和下载操作

难点

  • 如何进行文件上传操作

效果

  • 网站似乎有反爬机制,爬取速度很慢很慢
from selenium import webdriver
from time import sleep
from lxml import etree
import os
import requests

if __name__ == "__main__":

    #获取设置的参数信息
    path=os.path.abspath('.') #获取当前路径
    path_2=path+os.sep+'参数.txt'
    canshu_list=[]
    with open(path_2, 'r',encoding='utf-8') as f:
        for line in f.readlines():
            if len(line)!=1:
                line=line.rstrip("\n")
                canshu=line.split(':')[1]
                canshu_list.append(canshu)  
    
    #获取目标文件夹下所有子文件的路径
    wenjian_list=[]
    for root,dirs,files in os.walk(canshu_list[0]):
        for file in files:
            wenjian_list.append(os.path.join(root,file))
                       
    fanyi_list_name=canshu_list[0]+'.\\fanyi'
    #创建一个文件夹,存放翻译后的文件
    if not os.path.exists(fanyi_list_name):
        os.mkdir(fanyi_list_name)
 
    #开始进行爬取翻译文件操作
    
    # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
    driver = webdriver.Chrome(r'E:/chromedriver_win32/chromedriver.exe')
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }    
    
    #对每个文件的操作
    for wenjian in wenjian_list:
        #先对每个文件生成文件目录
        pdf_dress = wenjian.split('\\')[-1]
        pdf_perdir=fanyi_list_name+'\\'+pdf_dress.split('.')[0]
        os.mkdir(pdf_perdir)
        
        
        # 用get打开
        driver.get("http://www.pdfdo.com/pdf-split.aspx")
        
        #需要设置休眠来进行反爬
        sleep(1)
        driver.find_element_by_id('ctl00_content_rdopage2').click()
        sleep(1)
        driver.find_element_by_name('ctl00$content$txt1').send_keys('4')
        sleep(0.5)
        driver.find_element_by_name('File').send_keys(wenjian)
        sleep(1)
        driver.find_element_by_name('ctl00$content$cmdSaveAttachment').click()
        sleep(4)
        #获取标签数据
        page_text = driver.page_source
        tree = etree.HTML(page_text)
        url_list = tree.xpath('//*[@id="ctl00_content_lblNew"]/a/@href')
        
        url_list=url_list[1:]#需要剔除第一个文件路径,这个文件路径是下总的压缩包的
        
        cnt=0
        #对每个拆分后的文件的操作
        for url in url_list:
            print(url)
            cnt=cnt+1
            #获取整个pdf文件
            pdf_data = requests.get(url=url,headers=headers).content
            
            
            #生成PDF名称            
            pdf_name =  "("+str(cnt)+")" + pdf_dress
            
            #下载PDF
            with open(pdf_perdir+'\\'+pdf_name,'wb') as fp:
                fp.write(pdf_data)
                print(pdf_name,'下载成功')
        
    
    # 关闭浏览器
    driver.quit()

改进

查询后发现python提供了pypdf2这个库,可以对pdf进行操作

import os
import math
from PyPDF2 import PdfFileReader, PdfFileWriter

# 输入pdf路径,已经要保存的路径
# 将PDF文件每页分割为一个单独pdf的文件,并pdf保存至当前目录中
def pdf_split_1(pdf_input, path_output,want_to_page):
    fname = os.path.splitext(os.path.basename(pdf_input))[0] # 获取pdf文件名,去掉后缀名
    pdf = PdfFileReader(pdf_input)
    
    pdf_section=math.ceil(pdf.getNumPages()/want_to_page )
    
    page=0
    #开始遍历每个部分
    for i in range(pdf_section):
        pdf_writer = PdfFileWriter()
        
        #将页数加到正常值
        for j in range(want_to_page):
            page=i*want_to_page+j
            if page<pdf.getNumPages():
                pdf_writer.addPage(pdf.getPage(page))
            else:
                break
        
        output_filename = path_output + r'\{}-{}.pdf'.format(fname, i)

        with open(output_filename, 'wb') as out:
            pdf_writer.write(out)
            print('生成文件:{}'.format(output_filename))

if __name__ == "__main__":

    #获取设置的参数信息
    path=os.path.abspath('.') #获取当前路径
    path_2=path+os.sep+'参数.txt'
    canshu_list=[]
    with open(path_2, 'r',encoding='utf-8') as f:
        for line in f.readlines():
            if len(line)!=1:
                line=line.rstrip("\n")
                canshu=line.split(':')[1]
                canshu_list.append(canshu)  
    
    #获取目标文件夹下所有子文件的路径
    wenjian_list=[]
    for root,dirs,files in os.walk(canshu_list[0]):
        for file in files:
            wenjian_list.append(os.path.join(root,file))
                       
    
    fanyi_list_name=canshu_list[0]+'.\\fanyi'
    #创建一个文件夹,存放翻译后的文件
    if not os.path.exists(fanyi_list_name):
        os.mkdir(fanyi_list_name)
    
    for wenjian in wenjian_list:
        
        #在fanyi文件夹下创建各自文档的文件夹
        pdf_name = os.path.splitext(os.path.basename(wenjian))[0] # 获取pdf文件名,去掉后缀名
        pdf_dir=fanyi_list_name+'\\'+pdf_name
        if not os.path.exists(pdf_dir):
            os.mkdir(pdf_dir)
        
        pdf_split_1(wenjian, pdf_dir,int(canshu_list[1]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值