Skip to content

Commit 34c13c1

Browse files
committed
update with new GUI version
1 parent f669892 commit 34c13c1

8 files changed

Lines changed: 418 additions & 10 deletions

File tree

README.md

Lines changed: 81 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,91 @@
11
# PdfAutoRenameTools
22

3-
本软件原是王炳宁先生公开在他的[主页](https://bingning.wang/research/Article/?id=114)上,本人偶遇之,遂常用。但发现它有一个bug,很多paper只能截取第一行,于是通过luyten-0.5.4这个反编译软件得到代码,通过阅读后进行了小小的改动,做了一些简单的修正。
3+
> **你还在手动一篇一篇地给下载的论文 PDF 重命名吗?**
44
5-
生成的jar文件在\out\artifacts\PdfAutoRenameTools_jar\目录下,使用方法是:
5+
当你从学术搜索引擎批量下载论文时,得到的往往是 `paper.pdf``document(1).pdf``2401.08392.pdf` 这样毫无信息量的文件名。你需要逐一打开、找到标题、关闭、重命名——一篇论文至少浪费 10 秒钟。如果你有上百篇文献要整理,这件事将吞噬你整整一个下午。
66

7+
**PdfAutoRenameTools 帮你一键解决这个问题。**
8+
9+
它能够自动读取 PDF 首页的排版信息,精准识别出论文标题,并将文件重命名为标题本身。整个过程无需人工干预,批量处理,瞬间完成。
10+
11+
## 功能特性
12+
13+
- 🔍 **智能标题识别** — 基于 PDF 文本的字号与坐标信息,自动定位首页最大字号文字作为论文标题
14+
- 📂 **递归批量处理** — 支持递归扫描整个文件夹及其子目录,一次处理所有 PDF
15+
- 🖥️ **图形界面 + 命令行** — 提供 GUI 和 CLI 两种使用方式,满足不同场景需求
16+
-**并行处理** — 利用 Java 并行流加速,面对大量文献依然高效
17+
- 🛡️ **安全重命名** — GUI 模式下可先预览改名结果,确认后再执行,避免误操作
18+
19+
## 背景
20+
21+
本工具的核心算法源自王炳宁先生公开在[其主页](https://bingning.wang/research/Article/?id=114)上的原始版本。本人在日常科研中长期使用,受益良多。在使用过程中发现原版存在一个已知问题——部分论文的标题只能截取到第一行,导致重命名不完整。
22+
23+
为了修正这一问题,我通过反编译工具 [luyten](https://github.com/deathmarine/Luyten) 对原始 jar 进行了逆向分析,在充分理解源码逻辑后,对标题提取算法做了针对性优化,并在此基础上新增了 GUI 图形界面,使操作体验更加友好。
24+
25+
如王炳宁先生认为代码公开有不妥之处,可随时联系我删除。
26+
27+
## 使用方法
28+
29+
生成的 jar 文件位于 `out\artifacts\PdfAutoRenameTools_jar\` 目录下。
30+
31+
### 方式一:GUI 图形界面(推荐)
32+
33+
```bash
34+
java -jar PdfAutoRenameTools_GUI.jar
35+
```
36+
37+
启动后弹出图形界面:
38+
39+
1. 点击 **「选择文件夹」** — 选择包含 PDF 文件的目录
40+
2. 点击 **「扫描 PDF」** — 自动识别每个 PDF 的论文标题,表格实时显示「原文件名 → 新文件名」
41+
3. 确认无误后点击 **「确认重命名」** — 执行批量重命名
42+
43+
表格中状态以颜色区分:🟢 绿色 = 已重命名,🔴 红色 = 失败或跳过。
44+
45+
### 方式二:命令行
46+
47+
```bash
748
java -jar PdfAutoRenameTools.jar 目录名
49+
```
50+
51+
程序会递归扫描指定目录下的所有 PDF 文件,根据首页最大字号文字自动重命名。
52+
53+
## 技术实现
54+
55+
### 核心算法
56+
57+
标题识别的核心逻辑位于 `TextLocationExtender.java`
58+
59+
1. 继承 PDFBox 的 `PDFTextStripper`,在解析过程中捕获每个文本片段的**内容、字号、坐标**
60+
2. 将所有字号降序排列,取第 1/3 位字号作为阈值,过滤掉正文等小字号文本
61+
3. 在剩余文本中,选取 Y 坐标最小(即页面最上方)且字号一致的连续文本行,拼接为标题
62+
4. 对标题进行清理:移除连字符换行、替换文件名非法字符
63+
64+
### 源码结构
65+
66+
```
67+
src/nlpr/cip/
68+
├── Main.java # 程序入口(命令行)
69+
├── GuiMain.java # GUI 图形界面(Swing)
70+
├── TextLocationExtender.java # PDF 文本解析与标题提取核心
71+
├── Pair.java # 数据结构:(文本, 字号, X坐标, Y坐标)
72+
└── utils.java # 文件目录递归遍历工具
73+
```
874

9-
注意需要Java环境的版本要至少是14,以下是我当前用的java版本信息:
75+
### 依赖库
1076

11-
java version "14.0.1" 2020-04-14
77+
|| 版本 | 用途 |
78+
|----|------|------|
79+
| [Apache PDFBox](https://pdfbox.apache.org/) | 2.0.23 | PDF 文件解析与文本提取 |
80+
| [Apache Commons Logging](https://commons.apache.org/proper/commons-logging/) | 1.2 | 日志框架 |
81+
| [FontBox](https://pdfbox.apache.org/) | 3.0.0-RC1 | PDF 字体信息处理 |
1282

13-
Java(TM) SE Runtime Environment (build 14.0.1+7)
83+
## 编译环境
1484

15-
Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
85+
```
86+
java version "26.0.1" 2026-04-21
87+
Java(TM) SE Runtime Environment (build 26.0.1+8-34)
88+
Java HotSpot(TM) 64-Bit Server VM (build 26.0.1+8-34, mixed mode, sharing)
89+
```
1690

17-
如王炳宁先生发现代码公开有不妥之处,可以随时联系我删除
91+
运行需要 Java 环境,具体版本请自行配置
9.53 MB
Binary file not shown.
-4.28 KB
Binary file not shown.
-848 Bytes
Binary file not shown.
Binary file not shown.
-2.1 KB
Binary file not shown.

0 commit comments

Comments
 (0)