「安娜的档案」有些书的页码的是错乱的,不知有无快速编页的脚本之类的?

各位好,在「安娜的档案」里,有些书的页码的是错乱的,但这些错乱页面的顺序是有规律的。

例如从PDF导出的编号,假设以图片档130号开始,正确的页码顺序为:130.png、133.png、132.png、135.png、134.png、137.png、136.png、139.png、138.png、141.png

可发现,其规律就是「数字交替增加3和减少1」,或者更精确地说,是按照「偶数页+3、奇数页-1」的方式排列。

我目前作法是,把PDF导出为上述的PNG图片档,然后按照这个规律,将图片依序放入Adobe Acrobat,重新制作出一个页面顺序正确的PDF档。

这作法虽然可行,但是太耗时间,不知能不能用什么脚本之类的方法来自动处理?

附上一个这种情况的书本,有兴趣的版友不妨帮忙看看,说不定也有其他人遇到这样的问题 :slightly_smiling_face:

样本.pdf (11.4 MB)

直接问的通义千问,给出的脚本(我没测试,看起来是没问题):

import os
import shutil

def rename_png_files(directory):
    # 检查目标目录是否存在
    if not os.path.isdir(directory):
        print(f"Error: {directory} is not a valid directory.")
        return

    # 遍历目录中的所有文件
    for filename in os.listdir(directory):
        # 检查文件是否为.png格式
        if filename.endswith('.png'):
            # 提取文件名中的数字部分
            try:
                page_number = int(filename[:-4])
            except ValueError:
                print(f"Warning: {filename} does not have a numeric name, skipping.")
                continue

            # 根据奇偶性调整页码
            new_page_number = page_number + 3 if page_number % 2 == 0 else page_number - 1
            new_filename = f"new_{new_page_number}.png"

            # 构建完整的文件路径
            old_file_path = os.path.join(directory, filename)
            new_file_path = os.path.join(directory, new_filename)

            # 重命名文件
            shutil.move(old_file_path, new_file_path)
            print(f"Renamed '{filename}' to '{new_filename}'")

# 使用方法
directory_to_process = '/path/to/your/directory'  # 替换为你的目录路径
rename_png_files(directory_to_process)
1 个赞

先到文件中修改目录位置,然后按如下命令运行:

python3 image_rename.py

image_rename.py (1.2 KB) 测试了下,没有问题。

Renamed '21.png' to 'new_20.png'
Renamed '22.png' to 'new_25.png'
Renamed '23.png' to 'new_22.png'
Renamed '24.png' to 'new_27.png'
1 个赞

您是指把红字部份改成png档所在的目录资料夹吗?例如’E:\abcd’

请问这部份怎么用?我已安装Python 3.7(对这个一窍不通,不好意思…)

直接点,出现一个视窗,闪一下就跳掉了
image
PS 我可能先去休息了,明天再看 :handshake:

这个要在网上搜索下,文字讲不太清楚:

:star:Python在Windows命令行(Command Prompt)运行Python脚本或交互式地执行Python代码详解

是的,修改引号内的目录路径

1 个赞

我目前把目录改成这个("E:\2"是我放png图片的资料夹路径)
image
然后试了两种打法,似乎都不行,请求指点:

安装的版本是Python 3.7

找到问题了,原来是斜线要打这个/,而不是这个\

不过想再问一下,为何我这边指令是打python image_rename.py才有效果,而您是打python3 image_rename.py?

谢谢。

1 个赞

问的通义千问:

import os

# 使用反斜杠
path1 = 'C:\\Users\\YourUsername\\Documents'
print(os.listdir(path1))

# 使用正斜杠
path2 = 'C:/Users/YourUsername/Documents'
print(os.listdir(path2))

# 使用原始字符串
path3 = r'C:\Users\YourUsername\Documents'
print(os.listdir(path3))

# 使用环境变量
path4 = '%USERPROFILE%\\Desktop'
print(os.listdir(os.path.expandvars(path4)))

# 使用UNC路径
path5 = '\\\\server\\share\\folder'
print(os.listdir(path5))
1 个赞

我这边还安装了 python2 的版本,占用了 python 这个名称,可以跑起来就行。

1 个赞

(因为编辑的额度用完了,现在只能用回复的方式,请见谅 :handshake:

我上述的意思是,例如130.png是第一页,则133.png是第二页、132.png是第三页,以此类推。

而目前脚本的排序如下:
Renamed ‘130.png’ to ‘new_133.png’
Renamed ‘131.png’ to ‘new_130.png’
Renamed ‘132.png’ to ‘new_135.png’
Renamed ‘133.png’ to ‘new_132.png’
Renamed ‘134.png’ to ‘new_137.png’
Renamed ‘135.png’ to ‘new_134.png’

可见,并不是如我预期的,若以上页面为例,我希望的是:

Renamed ‘130.png’ to ‘新页面a.png’
Renamed ‘131.png’ to ‘new_130.png’
Renamed ‘132.png’ to ‘新页面c.png’
Renamed ‘133.png’ to ‘新页面b.png’
Renamed ‘134.png’ to ‘新页面e.png’
Renamed ‘135.png’ to ‘新页面d.png’

重新整理后会如下:
Renamed ‘130.png’ to ‘新页面a.png’
Renamed ‘133.png’ to ‘新页面b.png’
Renamed ‘132.png’ to ‘新页面c.png’
Renamed ‘135.png’ to ‘新页面d.png’
Renamed ‘134.png’ to ‘新页面e.png’

换言之,我希望页面的排列顺序是这样子的:
131.png、
130.png、
133.png、
132.png、
135.png、
134.png、
137.png、
136.png、
139.png、
138.png、
141.png

不知有没有办法做到? :pray:

你给的顺序是对的吗,按我理解是下面这种?

Renamed ‘130.png’ to ‘new_133.png’ = ‘c.png’
Renamed ‘131.png’ to ‘new_130.png’ = ‘a.png’
Renamed ‘132.png’ to ‘new_135.png’ = ‘d.png’
Renamed ‘133.png’ to ‘new_132.png’ = ‘b.png’
Renamed ‘134.png’ to ‘new_137.png’ = ‘e.png’
Renamed ‘135.png’ to ‘new_134.png’ = ‘d.png’

1 个赞

131.png呢?

1 个赞

情况是这样子的,我重新解释一下:

130.png(书本页码是125页)
131.png(书本页码是124页)
132.png(书本页码是127页)
133.png(书本页码是126页)
134.png(书本页码是129页)
135.png(书本页码是128页)

所以我需要按照书本实际的页码排列,即:

131.png(书本页码是124页)
130.png(书本页码是125页)
133.png(书本页码是126页)
132.png(书本页码是127页)
135.png(书本页码是128页)
134.png(书本页码是129页)

换言之,要如何让.png重新编号后,按照这顺序排列,是我目前需要的。

如果继续延伸,就像这样:

131.png、
130.png、
133.png、
132.png、
135.png、
134.png、
137.png、
136.png、
139.png、
138.png、
141.png

楼主说的实现逻辑太复杂了,就是很简单的奇数页偶数页错位,我以前遇到过,程序分开讨论枚举命名就行了。
你把以下逻辑发给gpt写就行:
让不小于130的偶数页start=131,递增increment为2;
奇数页start=130,递增increment为2。

1 个赞

就是奇数-7,偶数-5吧:

image_rename.py (1.2 KB)

Renamed ‘130.png’ to ‘new_125.png’
Renamed ‘131.png’ to ‘new_124.png’
Renamed ‘132.png’ to ‘new_127.png’
Renamed ‘133.png’ to ‘new_126.png’
Renamed ‘134.png’ to ‘new_129.png’
Renamed ‘135.png’ to ‘new_128.png’

如果还是不对,你可以自己修改文件中的第 22 行:

new_page_number = page_number - 5 if page_number % 2 == 0 else page_number - 7
1 个赞

通用程序,输入起始页数数字(哪里开始错位从哪里开始命名,全错误输入1),补位位数为输出文件要求位数(不需要补位输入1),不足位数前方补0

import os
import tkinter as tk
from tkinter import filedialog, messagebox
import re
import sys

def natural_sort_key(s):
    return [int(c) if c.isdigit() else c.lower() for c in re.split(r'(\d+)', s)]

def select_folder():
    folder_path = filedialog.askdirectory()
    if folder_path:
        folder_entry.delete(0, tk.END)
        folder_entry.insert(0, folder_path)

def rename_images():
    folder_path = folder_entry.get()
    start_page = start_page_entry.get()
    padding = int(padding_entry.get())

    if not folder_path or not start_page.isdigit():
        messagebox.showerror("错误", "请选择有效的文件夹并输入起始页数")
        return

    start_page = int(start_page)
    files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and re.match(r'^\d+\.[^.]+$', f)]
    files.sort(key=natural_sort_key)
    
    even_page = start_page + 1
    odd_page = start_page - 1

    for file in files:
        old_path = os.path.join(folder_path, file)
        file_name, file_ext = os.path.splitext(file)
        
        if file_name.isdigit():
            if int(file_name) % 2 == 0:
                new_name = f"{even_page:0{padding}d}{file_ext}"
                even_page += 2
            else:
                new_name = f"{odd_page:0{padding}d}{file_ext}"
                odd_page += 2
            
            new_path = os.path.join(folder_path, new_name)
            os.rename(old_path, new_path)
    
    messagebox.showinfo("完成", "图片重命名完成")

# 获取命令行参数
if len(sys.argv) > 1:
    padding = int(sys.argv[1])
else:
    padding = 1  # 默认不补位

# 创建主窗口
root = tk.Tk()
root.title("图片重命名工具")

# 创建并放置文件夹选择部分
folder_frame = tk.Frame(root)
folder_frame.pack(pady=10)

folder_label = tk.Label(folder_frame, text="选择文件夹:")
folder_label.grid(row=0, column=0, padx=5)

folder_entry = tk.Entry(folder_frame, width=50)
folder_entry.grid(row=0, column=1, padx=5)

folder_button = tk.Button(folder_frame, text="浏览", command=select_folder)
folder_button.grid(row=0, column=2, padx=5)

# 创建并放置起始页输入部分
start_page_frame = tk.Frame(root)
start_page_frame.pack(pady=10)

start_page_label = tk.Label(start_page_frame, text="起始页数:")
start_page_label.grid(row=0, column=0, padx=5)

start_page_entry = tk.Entry(start_page_frame, width=10)
start_page_entry.grid(row=0, column=1, padx=5)

# 创建并放置补位位数输入部分
padding_frame = tk.Frame(root)
padding_frame.pack(pady=10)

padding_label = tk.Label(padding_frame, text="补位位数:")
padding_label.grid(row=0, column=0, padx=5)

padding_entry = tk.Entry(padding_frame, width=10)
padding_entry.insert(0, str(padding))
padding_entry.grid(row=0, column=1, padx=5)

# 创建并放置重命名按钮
rename_button = tk.Button(root, text="开始重命名", command=rename_images)
rename_button.pack(pady=10)

root.mainloop()
1 个赞

楼主说的正文页我觉得不用考虑,全用数字从130开始命名就行,命名成new_xxx也不方便后续数字排序做成pdf。

这样子是可以的,目前测试有对应到书本的页码 :handshake:

不过遇到有负数编号的页码,要怎么让它排到0前面呢?还是就不管了,反正只有几页,就制作PDF时,用手拖曳一下顺序就好?

image

image

是没错,但是这样命名不方便后续数字增序排序,前方有别的字符,而且后方还有负数

你不需要准确的页码,直接奇数+0,偶数+2就行了。到对应代码行里修改。

new_page_number = page_number + 2 if page_number % 2 == 0 else page_number + 0