README.md•7.58 kB
# 项目介绍
由于项目基于streamlit并打包,打包后的exe文件只发挥python解释器的功能,而代码仍然以.py的python文件存在,在程序运行时才读取.py代码并运行,这就允许用户在pages中不断增加新的.py文件,增加新的功能。
## 项目结构
```
打包后的项目结构/
├── PDF分析和图片处理工具.exe # 启动程序
├── PDF.py # 第一个页面
├── main.py # PDF页面的后端程序,此文件以mcp服务的形式运行,可同时支持AI以MCP方式运行
├── pages/ # 子页面文件夹,每个子页面都是一个.py文件
│ ├── 图片批量旋转与尺寸调整工具.py
│ ├── 开源地址.py
│ ├── 后续新增的其他功能.py
```
## 已打包的模块
hiddenimports=['streamlit', 'streamlit.web.cli', 'streamlit-sortables', 'pandas', 'PIL', 'PyMuPDF', 'fitz', 'fastmcp', 'PyPDF2', 'tkinter', 'tkinter.filedialog', 'tkinter.simpledialog', 'tkinter.messagebox', 'tkinter.commondialog', 'tkinter.colorchooser', 'tkinter.font', 'tkinter.ttk', 'tkinter.scrolledtext', 'tkinter.dnd', 'tkinter.constants', 'tkinter.tix'],
# PDFSizeAnalyzer-MCP
## mcp工具介绍
### 1.统计 PDF 总页数,获取每一页的尺寸(以毫米为单位),同时统计 A3、A4等常见尺寸纸张的数量和页码范围
def analyze_pdf_pages(file_path: str) -> tuple:
"""
统计 PDF 总页数,获取每一页的尺寸(以毫米为单位),同时统计 A3、A4等常见尺寸纸张的数量和页码范围。
参数:
file_path (str): 单个PDF 文件的路径。
返回:
tuple: 包含两个元素的元组,第一个元素是 PDF 的总页数 (int),第二个元素是一个列表 (list),
列表中的每个元素是一个字典,包含纸张尺寸、纸张类型、总页数和页码范围。
"""
### 2.将 PDF 的每一页转换为图片,并保存到以 PDF 名称命名的文件夹中。
def convert_pdf_to_images(file_path: str)-> list:
"""
将 PDF 的每一页转换为图片,并保存到以 PDF 名称命名的文件夹中。
参数:
file_path (str): 单个 PDF 文件的路径。
返回:
list: 包含所有生成图片文件路径的列表。
"""
### 3.根据用户选择的章节拆分PDF文件,返回保存路径的字典列表。
def split_pdf_by_chapters(file_path: str, selected_chapters=None) -> list:
"""
根据用户选择的章节拆分PDF文件。
参数:
file_path (str): PDF文件的路径。
selected_chapters (list, 可选): 要拆分的章节列表。如果为None,则拆分所有章节。
返回:
list: 包含所有拆分后PDF文件路径的列表。
"""
### 4.从PDF中提取章节标题及其起始和结束页码。
def extract_pdf_chapters(file_path: str)-> list:
"""
从PDF中提取章节标题及其起始和结束页码。
参数:
file_path: PDF文件路径
返回:
chapters: 列表,每个元素是一个字典,包含章节信息
- level: 章节的层级(例如,1级书签、2级书签等)。层级越低,章节越重要或越靠上。
- title: 章节的标题。
- start_page: 章节的起始页码。
- end_page: 章节的结束页码。
"""
### 5.根据用户输入的页码范围将PDF分隔成多个单独的PDF文件。
def split_pdf_by_user_input(file_path: str, user_input: str) -> list:
"""
根据用户输入的页码范围将PDF分隔成多个单独的PDF文件。
Args:
file_path: 要分割的PDF文件路径。
user_input: 用户输入的页码范围,如"1-5,6,7-9,9-12"。
Returns:
分割后的PDF文件路径列表。
"""
### 6.压缩PDF文件,将PDF文件转换为图片型PDF,通过控制图片质量1-100实现体积压缩
def compress_pdf(file_path: str, quality: int = 75) -> str:
"""
PDF文件压缩(图片型)
参数:
file_path: PDF文件路径
quality: 压缩质量 (0-100)
返回:
str: 压缩后的PDF文件路径
"""
### 7.压缩PDF文件,通过删除不必要的元素实现体积压缩
def optimize_pdf(file_path: str) -> str:
"""
PDF优化压缩(文本保留型)
参数:
file_path: PDF文件路径
返回:
str: 优化后的PDF文件路径
"""
### 8.合并PDF文件
def merge_pdfs(file_paths: list, output_path: str) -> str:
"""
合并多个PDF文件为一个PDF文件
参数:
file_paths: 要合并的PDF文件路径列表
返回:
str: 合并后的PDF文件路径
"""
## 安装教程
### 1. 进入项目目录
在 Windows 系统中,可以使用以下命令进入项目目录:
```powershell
cd 替换为你的目录\pdfsize-analyzer-mcp
```
### 2. 创建虚拟环境
在 Windows 系统中,可以使用以下命令创建并激活虚拟环境:
```powershell
python -m venv venv
.\venv\Scripts\activate
```
### 3. 安装依赖
可以使用以下命令安装:
```powershell
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
```
### 4. 生成配置文件(以Trae为例)
运行 `生成mcp服务需要的配置文件.py` 文件生成 `mcp_config.json`:
在命令行中执行
```powershell
python 生成mcp服务需要的配置文件.py
```
将自动生成 `mcp_config.json` 文件,内容如下:
```json
{
"mcpServers": {
"PDFAnalyzer": {
"command": "虚拟环境中的python.exe",
"args": [
"主程序main.py的完整路径"
]
}
}
}
```
## 使用说明
### mcp使用说明
1. 确保已经按照安装教程完成环境配置。
2. 在'Trae'软件中,新增MCP,填入配置json内容。
3. 测试运行,确保配置正确。
- 测试1:调用mcp服务,告诉我一下这个pdf文件的页数,按打印尺寸分别统计下页数和页码.
### 本地浏览器使用说明
1. 用streamlit运行PDF.py
```bash
.\venv\Scripts\activate
streamlit run PDF.py --server.port 8501
```
2. 根据运行窗口生成的网址,或自动打开的网址,在浏览器中打开。
3. 上传pdf文件,根据需求点击按钮,结果展示在网页展示,并自动打开结果文件夹。
## pyinsaller打包教程
1. 激活虚拟环境
```bash
.\venv\Scripts\activate
```
2. 用spec打包,注意打包streamlit有点不同:
需要额外的run_app.py文件,需要特定的文件夹hooks,这个文件夹内还需要特定的hook-streamlit.py。
当然这些文件的内容都是固定的,不需要自己修改。
有了上面的基础,就可以打包了。注意修改run_app.spec中datas的文件夹路径
```bash
pyinstaller run_app.spec
```
3. 打包完成后,在 dist 目录下会生成一个可执行文件,但这个执行文件无法运行,还需要把依赖的py文件复制到dist目录下。
本项目中是:
PDF.py # 前端主程序
main.py # 后端主程序
pages/子页面的py文件 # 子页面的py文件
## 注意事项
- 确保使用的是虚拟环境中的 Python 解释器,涉及到依赖问题。
- 先用纯英文目录测试,成功后再测试中文目录。
# pages中页面
## 图片批量旋转与尺寸调整工具
这是整合了`谢基海`的代码
### 功能
- 批量旋转图片:支持批量旋转图片,用户可以选择旋转角度。
- 批量调整尺寸:支持批量调整图片尺寸,用户可以选择调整宽度和高度。