自制上班摸鱼pdf阅读器-更新3.0自动隐藏版本

[复制链接]
110 |12
发表于 3 小时前 | 显示全部楼层 |阅读模式
上班的时候,闲来无事,使用python写了一个pdf阅读器,用来摸鱼的,
我们公司电脑装有深信服,上网流量被管控,所以还是决定看一点文学作品来打法点时间,看能不能学到东西

    软件截图已上传, 自己工作完成之后,才能摸鱼哦!




1.0版本只能看文字   蓝奏盘: https://wwwp.lanzout.com/ixa512mnnvhe




20250204下午新增:
2.0版本新增图片展示功能:  蓝奏盘:  https://wwwp.lanzout.com/ibbQ42moenij




20250911 新增:
3.0版本: 听同事建议鼠标移开自动隐藏软件,评论区置顶的 是3.0代码 与 环境依赖  蓝奏盘:  [/backcolor" target="_blank" rel="noopener noreferrer nofollow">https://wwwp.lanzout.com/izdfE35whg4d






[Python]  
  1. import tkinter as tk
  2. from tkinter import scrolledtext, messagebox, filedialog, simpledialog
  3. import PyPDF2
  4. import threading
  5. class PDFViewerApp:
  6.     def __init__(self, root):
  7.         self.root = root
  8.         self.root.title("Viewer")
  9.         self.password = "8"  # 硬编码密码
  10.         self.mouse_position = (0, 0)  # 初始化鼠标位置
  11.         # 创建密码输入对话框
  12.         self.password_dialog = simpledialog.askstring("Password", "Enter password:", show="*")
  13.         if self.password_dialog != self.password:
  14.             messagebox.showerror("Error", "Incorrect password!")
  15.             self.root.destroy()
  16.             return
  17.         # 创建按钮
  18.         self.open_button = tk.Button(root, text="Choose a PDF file", command=self.choose_pdf)
  19.         self.open_button.pack(pady=10)
  20.         # 创建滚动文本框
  21.         self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=50, height=15)
  22.         self.text_area.pack(padx=10, pady=10)
  23.         # 创建进度标签
  24.         self.progress_label = tk.Label(root, text="")
  25.         self.progress_label.pack(pady=5)
  26.         # 创建鼠标位置标签
  27.         #self.mouse_label = tk.Label(root, text=f"Mouse Position: ({self.mouse_position[0]}, {self.mouse_position[1]})")
  28.         #self.mouse_label.pack(pady=5)
  29.         # 创建遮罩层
  30.         self.mask = tk.Frame(root, bg="white")#white
  31.         self.mask.place(relwidth=0, relheight=0)  # 初始位置不覆盖任何区域
  32.         self.mask.place_forget()  # 初始隐藏遮罩层
  33.         # 绑定鼠标移动事件
  34.         self.root.bind("", self.update_mouse_position)
  35.         self.root.bind("", self.show_mask)  # 鼠标离开窗口时显示遮罩
  36.         self.root.bind("", self.hide_mask)   # 鼠标进入窗口时隐藏遮罩
  37.     def choose_pdf(self):
  38.         file_path = filedialog.askopenfilename(
  39.             filetypes=[("PDF files", "*.pdf")],  # 只允许选择PDF文件
  40.             title="Choose a PDF file"
  41.         )
  42.         if file_path:  # 如果用户选择了文件
  43.             self.load_pdf_in_thread(file_path)
  44.     def load_pdf_in_thread(self, pdf_path):
  45.         # 启动新线程加载PDF文件
  46.         threading.Thread(target=self.open_pdf, args=(pdf_path,), daemon=True).start()
  47.         self.progress_label.config(text="Loading PDF...")
  48.     def open_pdf(self, pdf_path):
  49.         try:
  50.             with open(pdf_path, 'rb') as file:
  51.                 reader = PyPDF2.PdfReader(file)
  52.                 num_pages = len(reader.pages)
  53.                 self.text_area.delete('1.0', tk.END)  # 清除之前的内容
  54.                 for page_num in range(num_pages):
  55.                     page = reader.pages[page_num]
  56.                     text = page.extract_text()
  57.                     self.text_area.insert(tk.END, text)
  58.                     self.text_area.insert(tk.END, '\n' + '='*40 + '\n')  # 页面之间的分隔符
  59.                     # 使用after方法从线程更新GUI
  60.                     self.root.after(0, self.update_progress_label, f"Page {page_num + 1}/{num_pages} loaded")
  61.             self.root.after(0, self.progress_label.config, {'text': ""})
  62.         except Exception as e:
  63.             self.root.after(0, lambda: messagebox.showerror("Error", str(e)))
  64.             self.root.after(0, self.progress_label.config, {'text': ""})
  65.     def update_progress_label(self, text):
  66.         self.progress_label.config(text=text)
  67.     def update_mouse_position(self, event):
  68.         self.mouse_position = (event.x, event.y)
  69.         #self.mouse_label.config(text=f"Mouse Position: ({self.mouse_position[0]}, {self.mouse_position[1]})")
  70.         # 更新遮罩层位置和大小
  71.         if self.mask.winfo_ismapped():  # 如果遮罩层可见
  72.             self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)  # 根据PDF预览区域调整遮罩层
  73.     def show_mask(self, event):
  74.         self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)  # 覆盖PDF预览区域
  75.     def hide_mask(self, event):
  76.         self.mask.place_forget()  #
  77. if __name__ == "__main__":
  78.     root = tk.Tk()
  79.     app = PDFViewerApp(root)
  80.     root.mainloop()
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
2.0版本接入:  pdf內图片展示功能

===========================

原来的代码使用PyPDF2库,但PyPDF2的extract_text方法只能提取文本,无法处理图片,所以引入了 PyMuPDF(即fitz)库,可以同时处理图片与文字

===========================

蓝奏云: https://wwwp.lanzout.com/ibbQ42moenij

ps:  就引了两个包,怎么打包后体积直接干到30M?

==============================

改启动密码: self.password = "8"  # 硬编码密码
改视图大小: self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=50, height=15)

==============================

依赖安装指令:  pip install PyMuPDF Pillow

==============================


[Python]  
  1. import tkinter as tk
  2. from tkinter import scrolledtext, messagebox, filedialog, simpledialog
  3. import threading
  4. import fitz
  5. from PIL import Image, ImageTk
  6. import io
  7. class PDFViewerApp:
  8.     def __init__(self, root):
  9.         self.root = root
  10.         self.root.title("Viewer")
  11.         self.password = "8"  # 硬编码密码
  12.         self.mouse_position = (0, 0)
  13.         self.image_references = []  # 保存图片引用防止被回收
  14.         # 密码验证
  15.         self.password_dialog = simpledialog.askstring("Password", "Enter password:", show="*")
  16.         if self.password_dialog != self.password:
  17.             messagebox.showerror("Error", "Incorrect password!")
  18.             self.root.destroy()
  19.             return
  20.         # 界面组件
  21.         self.open_button = tk.Button(root, text="Choose a PDF file", command=self.choose_pdf)
  22.         self.open_button.pack(pady=10)
  23.         self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=50, height=15)
  24.         self.text_area.pack(padx=10, pady=10)
  25.         self.progress_label = tk.Label(root, text="")
  26.         self.progress_label.pack(pady=5)
  27.         # 遮罩层
  28.         self.mask = tk.Frame(root, bg="white")
  29.         self.mask.place(relwidth=0, relheight=0)
  30.         self.mask.place_forget()
  31.         # 事件绑定
  32.         self.root.bind("<Motion>", self.update_mouse_position)
  33.         self.root.bind("<Leave>", self.show_mask)
  34.         self.root.bind("<Enter>", self.hide_mask)
  35.     def choose_pdf(self):
  36.         file_path = filedialog.askopenfilename(
  37.             filetypes=[("PDF files", "*.pdf")],
  38.             title="Choose a PDF file"
  39.         )
  40.         if file_path:
  41.             self.load_pdf_in_thread(file_path)
  42.     def load_pdf_in_thread(self, pdf_path):
  43.         threading.Thread(target=self.open_pdf, args=(pdf_path,), daemon=True).start()
  44.         self.progress_label.config(text="Loading PDF...")
  45.     def open_pdf(self, pdf_path):
  46.         try:
  47.             doc = fitz.open(pdf_path)
  48.             num_pages = len(doc)
  49.             
  50.             # 清空之前的内容和图片引用
  51.             self.root.after(0, self.clear_content)
  52.             
  53.             for page_num in range(num_pages):
  54.                 page = doc.load_page(page_num)
  55.                 text = page.get_text()
  56.                 images = self.extract_images_from_page(doc, page)
  57.                
  58.                 # 将当前页内容添加到GUI
  59.                 self.root.after(0, self.insert_page_content, text, images)
  60.                 self.root.after(0, self.update_progress_label, f"Page {page_num+1}/{num_pages} loaded")
  61.             
  62.             self.root.after(0, self.progress_label.config, {'text': ""})
  63.             doc.close()
  64.         except Exception as e:
  65.             self.root.after(0, lambda: messagebox.showerror("Error", str(e)))
  66.             self.root.after(0, self.progress_label.config, {'text': ""})
  67.     def extract_images_from_page(self, doc, page):
  68.         images = []
  69.         image_list = page.get_images(full=True)
  70.         for img in image_list:
  71.             xref = img[0]
  72.             base_image = doc.extract_image(xref)
  73.             image_data = base_image["image"]
  74.             
  75.             # 转换图像尺寸
  76.             pil_image = Image.open(io.BytesIO(image_data))
  77.             pil_image.thumbnail((400, 400))  # 调整图片尺寸
  78.             tk_image = ImageTk.PhotoImage(pil_image)
  79.             images.append(tk_image)
  80.         return images
  81.     def clear_content(self):
  82.         self.text_area.delete('1.0', tk.END)
  83.         self.image_references.clear()
  84.     def insert_page_content(self, text, images):
  85.         self.text_area.insert(tk.END, text + "\n")
  86.         for img in images:
  87.             self.image_references.append(img)  # 保持引用
  88.             self.text_area.image_create(tk.END, image=img)
  89.             self.text_area.insert(tk.END, "\n")
  90.         self.text_area.insert(tk.END, "\n" + "="*60 + "\n\n")
  91.         self.text_area.see(tk.END)  # 滚动到最新内容
  92.     def update_progress_label(self, text):
  93.         self.progress_label.config(text=text)
  94.     def update_mouse_position(self, event):
  95.         self.mouse_position = (event.x, event.y)
  96.         if self.mask.winfo_ismapped():
  97.             self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)
  98.     def show_mask(self, event):
  99.         self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)
  100.     def hide_mask(self, event):
  101.         self.mask.place_forget()
  102. if __name__ == "__main__":
  103.     root = tk.Tk()
  104.     app = PDFViewerApp(root)
  105.     root.mainloop()
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
[Python]  
[code]import tkinter as tk
from tkinter import scrolledtext, messagebox, filedialog, simpledialog
import PyPDF2
import threading
from pynput import keyboard as pynput_keyboard


class PDFViewerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF Reader")
        self.password = "8"  # 硬编码密码

        # 密码验证
        password_input = simpledialog.askstring("密码检测", "输入密码:", show="*")
        if password_input != self.password:
            messagebox.showerror("错误", "密码错误!")
            self.root.destroy()
            return

        #
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
我公司办公场所都安装了监控摄像头,发现摸鱼罚款1000元并警告一次,三次警告直接卷铺盖走人
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
首先感谢分享这个小工具,提点意见:
1、pdf图片不能显示出来,全显示的文字。
2、pdf文档显示窗口太小,四周空边太多,如果能扩大显示窗口就更好了。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
感谢分享。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
用python写程序,棒
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
摸鱼必备,能实现鼠标移开范围后,整个窗口隐藏吗
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
呵呵~有点意思
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
那得先想想,想唤出界面时怎么操作啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表