import os
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
# 定义一个函数,用于将文件分割成多个小文档
def split_file_to_pages(file_path, page_size=4000):
# 打开文件并读取内容
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 计算出总页数
num_pages = (len(content) + page_size - 1) // page_size
# 将文档分割成多个小文档
pages = [content[i*page_sizei+1)*page_size] for i in range(num_pages)]
return pages
# 定义一个函数,用于生成HTML文件
def create_html_file(file_path, page_num, page_content, prev_page_link, title_link, next_page_link, file_base_name, target_folder):
# 生成HTML内容
html = f'''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{file_base_name} - 第{page_num:03d}页</title>
</head>
<body>
<div>{prev_page_link}<a href="{file_base_name}_{page_num-1:03d}.html#page{page_num-1}">上一页</a>{title_link}<a href="{file_base_name}_index.html">目录</a>{next_page_link}</div>
<hr>
<div>{page_content}</div>
<hr>
<div>{prev_page_link}<a href="{file_base_name}_{page_num+1:03d}.html#page{page_num+1}">下一页</a>{title_link}<a href="{file_base_name}_index.html">目录</a>{next_page_link}</div>
</body>
</html>
'''
# 写入HTML文件
target_file_path = os.path.join(target_folder, f'{file_base_name}_{page_num:03d}.html')
with open(target_file_path, 'w', encoding='utf-8') as f:
f.write(html)
# 定义一个函数,用于生成索引页面
def create_index_page(file_base_name, target_folder):
# 获取所有小文档的文件名(包含路径)
file_names = [f for f in os.listdir(target_folder) if f.startswith(file_base_name) and f.endswith('.html')]
file_names.sort() # 按文件名排序
# 生成HTML内容
html = f'''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>目录 - {file_base_name}</title>
</head>
<body>
<h1>{file_base_name}</h1>
<ul>
'''
for i, file_name in enumerate(file_names):
html += f'<li><a href="{file_name}">{file_name.replace(".html", "")}</a></li>'
html += '''
</ul>
</body>
</html>
'''
# 写入HTML文件
target_file_path = os.path.join(target_folder, f'{file_base_name}_index.html')
with open(target_file_path, 'w', encoding='utf-8') as f:
f.write(html)
# 创建GUI界面
root = tk.Tk()
root.title('文本文件分割')
# 创建文件选择框
file_label = ttk.Label(root, text='请选择要分割的文件:')
file_label.pack(padx=10, pady=10, side=tk.LEFT)
file_entry = ttk.Entry(root, width=40)
file_entry.pack(padx=10, pady=10, side=tk.LEFT)
def browse_file():
file_path = filedialog.askopenfilename(title='选择要分割的文件', filetypes=[('Text Files', '*.txt')])
file_entry.delete(0, tk.END)
file_entry.insert(0, file_path)
browse_button = ttk.Button(root, text='浏览', command=browse_file)
browse_button.pack(padx=10, pady=10, side=tk.LEFT)
# 创建输出文件夹选择框
output_folder_label = ttk.Label(root, text='请选择输出文件夹:')
output_folder_label.pack(padx=10, pady=10, side=tk.LEFT)
output_folder_entry = ttk.Entry(root, width=40)
output_folder_entry.pack(padx=10, pady=10, side=tk.LEFT)
def browse_output_folder():
folder_path = filedialog.askdirectory(title='选择输出文件夹')
output_folder_entry.delete(0, tk.END)
output_folder_entry.insert(0, folder_path)
browse_output_folder_button = ttk.Button(root, text='浏览', command=browse_output_folder)
browse_output_folder_button.pack(padx=10, pady=10, side=tk.LEFT)
# 定义一个函数,用于开始分割文件
def split_files():
# 获取目标文件路径 '''
# 写入HTML文件
target_file_path = os.path.join(target_folder, f'{file_base_name}_index.html')
with open(target_file_path, 'w', encoding='utf-8') as f:
f.write(html)
# 创建GUI界面
root = tk.Tk()
root.title('文本文件分割')
# 创建文件选择框
file_label = ttk.Label(root, text='请选择要分割的文件:')
file_label.pack(padx=10, pady=10, side=tk.LEFT)
file_entry = ttk.Entry(root, width=40)
file_entry.pack(padx=10, pady=10, side=tk.LEFT)
def browse_file():
file_path = filedialog.askopenfilename(title='选择要分割的文件', filetypes=[('Text Files', '*.txt')])
file_entry.delete(0, tk.END)
file_entry.insert(0, file_path)
browse_button = ttk.Button(root, text='浏览', command=browse_file)
browse_button.pack(padx=10, pady=10, side=tk.LEFT)
# 创建输出文件夹选择框
output_folder_label = ttk.Label(root, text='请选择输出文件夹:')
output_folder_label.pack(padx=10, pady=10, side=tk.LEFT)
output_folder_entry = ttk.Entry(root, width=40)
output_folder_entry.pack(padx=10, pady=10, side=tk.LEFT)
def browse_output_folder():
folder_path = filedialog.askdirectory(title='选择输出文件夹')
output_folder_entry.delete(0, tk.END)
output_folder_entry.insert(0, folder_path)
browse_output_folder_button = ttk.Button(root, text='浏览', command=browse_output_folder)
browse_output_folder_button.pack(padx=10, pady=10, side=tk.LEFT)
# 定义一个函数,用于开始分割文件
def split_files():
# 获取目标文件路径
file_path = file_entry.get()
if not file_path:
messagebox.showerror('错误', '请选择要分割的文件!')
return
# 获取输出文件夹路径
folder_path = output_folder_entry.get()
if not folder_path:
messagebox.showerror('错误', '请选择输出文件夹!')
return
# 获取文件名(不包含路径和扩展名)
file_base_name = os.path.splitext(os.path.basename(file_path))[0]
# 将文件分割成多个小文档
pages = split_file_to_pages(file_path)
# 生成每个小文档对应的HTML文件
for i, page_content in enumerate(pages):
page_num = i + 1
prev_page_link = '' if page_num == 1 else f'<a href="{file_base_name}_{page_num-1:03d}.html#page{page_num-1}">上一页</a>'
next_page_link = '' if page_num == len(pages) else f'<a href="{file_base_name}_{page_num+1:03d}.html#page{page_num+1}">下一页</a>'
title_link = f'<a href="{file_base_name}_index.html">目录</a>'
create_html_file(file_path, page_num, page_content, prev_page_link, title_link, next_page_link, file_base_name, folder_path)
# 生成索引页面
create_index_page(file_base_name, folder_path)
# 显示完成消息
messagebox.showinfo('完成', '文件分割完成!')
# 创建开始分割按钮
split_button = ttk.Button(root, text='开始分割', command=split_files)
split_button.pack(padx=10, pady=10, side=tk.LEFT)
# 启动GUI界面
root.mainloop()
|