PDF页面检验以及PDF分割
在工作过程中,因为一些存储介质的损坏,出现了pdf损坏的情况,主要是一些PDF的损坏,这些PDF能够打开但是某些页面损坏或者说是损坏,不能正常显示。经过查询了解到了一些方法。记录生活
使用简介
使用语言
使用了Python语言以及Python语言中的
使用工具以及配置环境
这是一个使用Python的pyPdf库编写的小程序,可以自动校验指定文件夹下的所有PDF文件。该工具在命令行中运行,不依赖于任何PDF浏览工具。所以要配置python以及它所使用的pypdf库。
-
确保你的计算机上已经安装了Python。你可以从Python官网下载并安装它。检查Python版本是否符合PyPDF2库的要求。PyPDF2支持Python 3.6及以上版本。
点击Install Now 安装记得勾选Add python.exe to PATH 方便之后运行代码,安装成功之后可以在最近添加中查看 -
在网站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双击就能运行。