PDF页面检验以及PDF分割

PDF页面检验以及PDF分割

在工作过程中,因为一些存储介质的损坏,出现了pdf损坏的情况,主要是一些PDF的损坏,这些PDF能够打开但是某些页面损坏或者说是损坏,不能正常显示。经过查询了解到了一些方法。记录生活

使用简介

使用语言

使用了Python语言以及Python语言中的

使用工具以及配置环境

下载工具
​ 这是一个使用Python的pyPdf库编写的小程序,可以自动校验指定文件夹下的所有PDF文件。该工具在命令行中运行,不依赖于任何PDF浏览工具。所以要配置python以及它所使用的pypdf库。

  1. 确保你的计算机上已经安装了Python。你可以从Python官网下载并安装它。检查Python版本是否符合PyPDF2库的要求。PyPDF2支持Python 3.6及以上版本。

    python安装图片
    点击Install Now 安装记得勾选Add python.exe to PATH 方便之后运行代码,安装成功之后可以在最近添加中查看

    安装成功图片

  2. 在网站PyPDF2 · PyPI中下载,建议下载第二个.whl格式的
    下载界面图片
    ​ 因为第一个下载之后安装会出现如下报错界面:
    报错界面
    下载第二个之后记得安装,在所下载的目录下输入cmd调出命令行,输入
    在这里插入图片描述

pip install pypdf2-3.0.1-py3-none-any.whl

PDF页面检验源码

使用说明:这段代码会检查pdf的每一页,只要是损坏的页面都能检查出来,空白页不会被误判为错误页,使用时记得将路径改为你想检查的路径。

   folder_path = 'D:\\桌面文件所在处\\pdf实验' # 将路径改为你想要检查的路径

完整代码如下:

import os
from PyPDF2 import PdfReader

def check_pdf_page_integrity(pdf_path):
    try:
        # 尝试打开PDF文件
        reader = PdfReader(pdf_path)
        num_pages = len(reader.pages)

        # 遍历每一页
        for i in range(num_pages):
            # 尝试读取每一页的内容
            page = reader.pages[i]
            page_content = page.extract_text()
            
            # 如果成功读取,则打印页码和读取状态
            print(f"第{i + 1}页检查通过")
            
        # 如果所有页都被成功读取,则返回True
        print(f"{os.path.basename(pdf_path)}的所有页面都完整")
        print()  # 添加空行
        return (os.path.basename(pdf_path), True)
    except Exception as e:
        # 如果读取页时发生异常,打印错误信息
        print(f"第{i + 1}页检查失败:{e}")
        print()  # 添加空行
        return (os.path.basename(pdf_path), False)

def check_pdfs_in_folder(folder_path):
    # 确保输出文件的路径存在
    output_txt_path = os.path.join(folder_path, '损坏的pdf文件.txt')
    if not os.path.exists(folder_path):
        print("文件夹不存在")
        return

    # 收集所有PDF文件
    pdf_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.lower().endswith('.pdf')]

    # 将损坏的文件名写入文本文件
    with open(output_txt_path, 'w') as file:
        for pdf_file in pdf_files:
            filename, is_intact = check_pdf_page_integrity(pdf_file)
            if not is_intact:
                file.write(filename + '\n')
                print(f"{filename}已损坏")

    # 检查是否有损坏的文件
    damaged_count = len([f for f in pdf_files if not check_pdf_page_integrity(f)[1]])
    if damaged_count == 0:
        print("所有PDF文件检查完毕,没有发现损坏的文件")
    else:
        print(f"检查完成。损坏的文件已保存到{output_txt_path}")

if __name__ == '__main__':
    folder_path = 'D:\\桌面文件所在处\\pdf实验' # 将路径改为你想要检查的路径
    check_pdfs_in_folder(folder_path)

PDF按照输入页码分割

使用说明:按照输入的页码将pdf分割为两个pdf,分割两个pdf以原名_0001 和 原名下划线0002命名。

directory = r'D:\2024\6'  # PDF文件所在的目录,只需将'  '中的内容改为你所需要拆分的路径
page_to_split = 6  # 你想要拆分的页码,输入6则1-6为第一个pdf,6之后为第二个pdf
output_directory = 'output'  # 输出目录,如果不指定则默认为原路径,可指定输出目录,不指定则输出在原路径下面

完整代码:

import os
import PyPDF2

def split_pdf(input_path, output_path, page_to_split):
    # 确保输出路径存在
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    
    # 读取PDF文件
    with open(input_path, 'rb') as file:
        reader = PyPDF2.PdfReader(file)
        num_pages = len(reader.pages)
        
        # 创建第一个PDF文件
        writer1 = PyPDF2.PdfWriter()
        for i in range(page_to_split):
            page = reader.pages[i]
            writer1.add_page(page)
        
        # 保存第一个PDF文件
        base_name = os.path.splitext(os.path.basename(input_path))[0]
        output_file1 = f"{output_path}/{base_name}_0001.pdf"
        with open(output_file1, 'wb') as f1:
            writer1.write(f1)
        
        # 如果有剩余页面,则创建第二个PDF文件
        if page_to_split < num_pages:
            writer2 = PyPDF2.PdfWriter()
            for i in range(page_to_split, num_pages):
                page = reader.pages[i]
                writer2.add_page(page)
            
            # 保存第二个PDF文件
            output_file2 = f"{output_path}/{base_name}_0002.pdf"
            with open(output_file2, 'wb') as f2:
                writer2.write(f2)

def process_all_pdfs(directory, page_to_split, output_directory=None):
    if output_directory is None:
        output_directory = directory
    for filename in os.listdir(directory):
        if filename.lower().endswith('.pdf'):
            input_path = os.path.join(directory, filename)
            split_pdf(input_path, output_directory, page_to_split)
    print("所有PDF文件处理完成。")

# 使用示例
directory = r'D:\2024\6'  # PDF文件所在的目录
page_to_split = 6  # 你想要拆分的页码
output_directory = 'output'  # 输出目录,如果不指定则默认为原路径
process_all_pdfs(directory, page_to_split, output_directory)

使用方法

将上述代码复制之后到创建a.txt文本中,将a.txt后缀改为a.py,然后在cmd中输入命令python a.py 即可运行,运行之后即可查看结果

小工具-批处理程序移动特定文件名的文件到特定文件夹

@echo off
setlocal enabledelayedexpansion

:: 设置目标文件夹路径
set "destinationFolder=D:\2024\4"

:: 检查目标文件夹是否存在,如果不存在则创建
if not exist "%destinationFolder%" (
    mkdir "%destinationFolder%"
    echo Created destination folder: %destinationFolder%
)

:: 文件名列表文件
set "fileListFile=fileList.txt"

:: 检查文件名列表文件是否存在
if not exist "%fileListFile%" (
    echo File list file not found: %fileListFile%
    goto end
)

:: 读取文件名列表并尝试移动文件
for /f "tokens=*" %%a in (%fileListFile%) do (
    set "currentFileName=%%a"
    if exist "%%a" (
        echo Moving file: %%a
        move "%%a" "%destinationFolder%"
        if !errorlevel! equ 0 (
            echo Successfully moved: %%a
        ) else (
            echo Failed to move: %%a
        )
    ) else (
        echo File not found in current directory: %%a
    )
)

:end
echo Done.
pause

运行路径下创建一个fileList.txt,将文件夹以一行一个放入其中
在这里插入图片描述
使用时将destinationFolder=后面的路径改为你想移动到的指定文件夹的路径

set "destinationFolder=D:\2024\4"

然后复制代码到txt文件,将该文件后缀改为.bat双击就能运行
在这里插入图片描述
使用时将destinationFolder=后面的路径改为你想移动到的指定文件夹的路径

set "destinationFolder=D:\2024\4"

然后复制代码到txt文件,将该文件后缀改为.bat双击就能运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值