EasyGUI+PyDF2应用小示例—PDF页面提取应用程序
最近撸一本Python的学习书籍,有这样的一个应用小示例,就是利用EasyGUI编写一个从PDF中提取页面的GUI程序。
具体要求如下:
(1)请求用户选择要打开的PDF文件
(2)如果用户没有选择PDF文件,则退出程序
(3)请求用户输入起始页码
(4)如果用户没有输入起始页码,则退出程序 (
(5)合法的页码应当是整数,如果用户输入了不合法的页码:
警告用户输入的页码不合法;
回到第(3)步
(6)请求用户输入结束页码
(7)如果用户没有输入结束页码,则退出程序
(8)合法的页码应当是整数。如果用户输入了不合法的页码:
警告用户输入的页码不合法 回到第(6)步
(9)询问提取出来的页面的保存位置
(10)如果用户没有选择保存位置,则退出程序
(11)如果用户选择了和输入文件路径相同的位置:
警告用户不允许覆盖输入文件 回到第(9)步
(12)进行页面提取: 打开输入的PDF文件 将指定范围内的页面提取出来,写入新的PDF文件中。
简单ASCII流程图示例
+-------------------------+
| 开始 |
+-------------------------+
|
v
+-------------------------+
| 请求用户选择PDF文件 |
+-------------------------+
|
+--+--+
| |
选择 不选择
| |
v v
+-----------------+ +-----------------+
| 输入用户输入的 | | 退出程序 |
| 起始页码 | +-----------------+
+-----------------+
|
+----+-----+
| |
输入合法? |
| |
是 否
| |
v v
+-----------------+
| 输入用户输入的 |
| 结束页码 |
+-----------------+
|
+----+-----+
| |
输入合法? |
| |
是 否
| |
v v
+-----------------+
| 询问保存位置 |
+-----------------+
|
+----+-----+
| |
选择 不选择
| |
v v
+-----------------+ +-----------------+
| 保存位置与输入 | | 退出程序 |
| 文件相同? | +-----------------+
+-----------------+
|
+----+-----+
| |
是 否
| |
v v
+-----------------+
| 提取页面 |
+-----------------+
|
+-----------------+
| 显示完成消息 |
+-----------------+
|
+-----------------+
| 结束 |
+-----------------+
源码如下:
import easygui as eg
from PyPDF2 import PdfReader, PdfWriter
def main():
# 请求用户选择要打开的PDF文件
pdf_file = eg.fileopenbox(msg="选择要打开的PDF文件", title="选择PDF", default="*.pdf")
if not pdf_file:
eg.msgbox("未选择文件,程序退出。")
return
# 请求用户输入起始页码
while True:
start_page_str = eg.enterbox("请输入起始页码(整数):", title="输入起始页码")
if not start_page_str:
eg.msgbox("未输入起始页码,程序退出。")
return
try:
start_page = int(start_page_str) - 1 # 转换为0索引
break
except ValueError:
eg.msgbox("输入的页码不合法,请重新输入!")
# 请求用户输入结束页码
while True:
end_page_str = eg.enterbox("请输入结束页码(整数):", title="输入结束页码")
if not end_page_str:
eg.msgbox("未输入结束页码,程序退出。")
return
try:
if int(end_page_str) >= int(start_page_str):
end_page = int(end_page_str) # 不用减1,因为结束页是包含的
break
else:
eg.msgbox("结束页码不能小于起始页码!!!")
except ValueError:
eg.msgbox("输入的页码不合法,请重新输入!")
# 询问提取出来的页面的保存位置
while True:
save_path = eg.filesavebox(msg="选择保存提取后的PDF文件的位置", title="保存PDF", default="*.pdf")
if not save_path:
eg.msgbox("未选择保存位置,程序退出。")
return
if save_path == pdf_file:
eg.msgbox("不允许覆盖输入文件,请选择其他位置!")
else:
break
# 进行页面提取
try:
with open(pdf_file, 'rb') as infile:
reader = PdfReader(infile)
writer = PdfWriter()
# 检查页码范围有效性
total_pages = len(reader.pages)
if start_page < 0 or end_page > total_pages or start_page >= end_page:
eg.msgbox(f"页码范围不合法:总页数为 {total_pages}。")
return
for page_num in range(start_page, end_page):
writer.add_page(reader.pages[page_num])
# 保存提取的PDF
with open(save_path, 'wb') as outfile:
writer.write(outfile)
eg.msgbox("页面提取完成!")
except Exception as e:
eg.msgbox(f"发生错误:{str(e)}")
if __name__ == "__main__":
main()
原创不易,欢迎关注、点赞、转发!!!