骑着悟空看八戒 发表于 5 天前

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

上班的时候,闲来无事,使用python写了一个pdf阅读器,用来摸鱼的,
我们公司电脑装有深信服,上网流量被管控,所以还是决定看一点文学作品来打法点时间,看能不能学到东西

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




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




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




20250911 新增:
3.0版本: 听同事建议鼠标移开自动隐藏软件,评论区置顶的 是3.0代码 与 环境依赖蓝奏盘:







import tkinter as tk
from tkinter import scrolledtext, messagebox, filedialog, simpledialog
import PyPDF2
import threading

class PDFViewerApp:
    def __init__(self, root):
      self.root = root
      self.root.title("Viewer")
      self.password = "8"# 硬编码密码
      self.mouse_position = (0, 0)# 初始化鼠标位置

      # 创建密码输入对话框
      self.password_dialog = simpledialog.askstring("Password", "Enter password:", show="*")
      if self.password_dialog != self.password:
            messagebox.showerror("Error", "Incorrect password!")
            self.root.destroy()
            return

      # 创建按钮
      self.open_button = tk.Button(root, text="Choose a PDF file", command=self.choose_pdf)
      self.open_button.pack(pady=10)

      # 创建滚动文本框
      self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=50, height=15)
      self.text_area.pack(padx=10, pady=10)

      # 创建进度标签
      self.progress_label = tk.Label(root, text="")
      self.progress_label.pack(pady=5)

      # 创建鼠标位置标签
      #self.mouse_label = tk.Label(root, text=f"Mouse Position: ({self.mouse_position}, {self.mouse_position})")
      #self.mouse_label.pack(pady=5)

      # 创建遮罩层
      self.mask = tk.Frame(root, bg="white")#white
      self.mask.place(relwidth=0, relheight=0)# 初始位置不覆盖任何区域
      self.mask.place_forget()# 初始隐藏遮罩层

      # 绑定鼠标移动事件
      self.root.bind("", self.update_mouse_position)
      self.root.bind("", self.show_mask)# 鼠标离开窗口时显示遮罩
      self.root.bind("", self.hide_mask)   # 鼠标进入窗口时隐藏遮罩

    def choose_pdf(self):
      file_path = filedialog.askopenfilename(
            filetypes=[("PDF files", "*.pdf")],# 只允许选择PDF文件
            title="Choose a PDF file"
      )
      if file_path:# 如果用户选择了文件
            self.load_pdf_in_thread(file_path)

    def load_pdf_in_thread(self, pdf_path):
      # 启动新线程加载PDF文件
      threading.Thread(target=self.open_pdf, args=(pdf_path,), daemon=True).start()
      self.progress_label.config(text="Loading PDF...")

    def open_pdf(self, pdf_path):
      try:
            with open(pdf_path, 'rb') as file:
                reader = PyPDF2.PdfReader(file)
                num_pages = len(reader.pages)

                self.text_area.delete('1.0', tk.END)# 清除之前的内容

                for page_num in range(num_pages):
                  page = reader.pages
                  text = page.extract_text()
                  self.text_area.insert(tk.END, text)
                  self.text_area.insert(tk.END, '\n' + '='*40 + '\n')# 页面之间的分隔符

                  # 使用after方法从线程更新GUI
                  self.root.after(0, self.update_progress_label, f"Page {page_num + 1}/{num_pages} loaded")

            self.root.after(0, self.progress_label.config, {'text': ""})

      except Exception as e:
            self.root.after(0, lambda: messagebox.showerror("Error", str(e)))
            self.root.after(0, self.progress_label.config, {'text': ""})

    def update_progress_label(self, text):
      self.progress_label.config(text=text)

    def update_mouse_position(self, event):
      self.mouse_position = (event.x, event.y)
      #self.mouse_label.config(text=f"Mouse Position: ({self.mouse_position}, {self.mouse_position})")

      # 更新遮罩层位置和大小
      if self.mask.winfo_ismapped():# 如果遮罩层可见
            self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)# 根据PDF预览区域调整遮罩层

    def show_mask(self, event):
      self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)# 覆盖PDF预览区域

    def hide_mask(self, event):
      self.mask.place_forget()#


if __name__ == "__main__":
    root = tk.Tk()
    app = PDFViewerApp(root)
    root.mainloop()





风之影赫 发表于 5 天前

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

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



import tkinter as tk
from tkinter import scrolledtext, messagebox, filedialog, simpledialog
import threading
import fitz
from PIL import Image, ImageTk
import io

class PDFViewerApp:
    def __init__(self, root):
      self.root = root
      self.root.title("Viewer")
      self.password = "8"# 硬编码密码
      self.mouse_position = (0, 0)
      self.image_references = []# 保存图片引用防止被回收

      # 密码验证
      self.password_dialog = simpledialog.askstring("Password", "Enter password:", show="*")
      if self.password_dialog != self.password:
            messagebox.showerror("Error", "Incorrect password!")
            self.root.destroy()
            return

      # 界面组件
      self.open_button = tk.Button(root, text="Choose a PDF file", command=self.choose_pdf)
      self.open_button.pack(pady=10)

      self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=50, height=15)
      self.text_area.pack(padx=10, pady=10)

      self.progress_label = tk.Label(root, text="")
      self.progress_label.pack(pady=5)

      # 遮罩层
      self.mask = tk.Frame(root, bg="white")
      self.mask.place(relwidth=0, relheight=0)
      self.mask.place_forget()

      # 事件绑定
      self.root.bind("<Motion>", self.update_mouse_position)
      self.root.bind("<Leave>", self.show_mask)
      self.root.bind("<Enter>", self.hide_mask)

    def choose_pdf(self):
      file_path = filedialog.askopenfilename(
            filetypes=[("PDF files", "*.pdf")],
            title="Choose a PDF file"
      )
      if file_path:
            self.load_pdf_in_thread(file_path)

    def load_pdf_in_thread(self, pdf_path):
      threading.Thread(target=self.open_pdf, args=(pdf_path,), daemon=True).start()
      self.progress_label.config(text="Loading PDF...")

    def open_pdf(self, pdf_path):
      try:
            doc = fitz.open(pdf_path)
            num_pages = len(doc)
            
            # 清空之前的内容和图片引用
            self.root.after(0, self.clear_content)
            
            for page_num in range(num_pages):
                page = doc.load_page(page_num)
                text = page.get_text()
                images = self.extract_images_from_page(doc, page)
               
                # 将当前页内容添加到GUI
                self.root.after(0, self.insert_page_content, text, images)
                self.root.after(0, self.update_progress_label, f"Page {page_num+1}/{num_pages} loaded")
            
            self.root.after(0, self.progress_label.config, {'text': ""})
            doc.close()
      except Exception as e:
            self.root.after(0, lambda: messagebox.showerror("Error", str(e)))
            self.root.after(0, self.progress_label.config, {'text': ""})

    def extract_images_from_page(self, doc, page):
      images = []
      image_list = page.get_images(full=True)
      for img in image_list:
            xref = img
            base_image = doc.extract_image(xref)
            image_data = base_image["image"]
            
            # 转换图像尺寸
            pil_image = Image.open(io.BytesIO(image_data))
            pil_image.thumbnail((400, 400))# 调整图片尺寸
            tk_image = ImageTk.PhotoImage(pil_image)
            images.append(tk_image)
      return images

    def clear_content(self):
      self.text_area.delete('1.0', tk.END)
      self.image_references.clear()

    def insert_page_content(self, text, images):
      self.text_area.insert(tk.END, text + "\n")
      for img in images:
            self.image_references.append(img)# 保持引用
            self.text_area.image_create(tk.END, image=img)
            self.text_area.insert(tk.END, "\n")
      self.text_area.insert(tk.END, "\n" + "="*60 + "\n\n")
      self.text_area.see(tk.END)# 滚动到最新内容

    def update_progress_label(self, text):
      self.progress_label.config(text=text)

    def update_mouse_position(self, event):
      self.mouse_position = (event.x, event.y)
      if self.mask.winfo_ismapped():
            self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)

    def show_mask(self, event):
      self.mask.place(relx=0, rely=0, relwidth=1, relheight=1)

    def hide_mask(self, event):
      self.mask.place_forget()

if __name__ == "__main__":
    root = tk.Tk()
    app = PDFViewerApp(root)
    root.mainloop()



寒哥Gh61ac8 发表于 5 天前


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

      #

寒哥Gh61ac8 发表于 5 天前

我公司办公场所都安装了监控摄像头,发现摸鱼罚款1000元并警告一次,三次警告直接卷铺盖走人

寒哥Gh61ac8 发表于 5 天前

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

风之影赫 发表于 5 天前

感谢分享。

huoxianghui913 发表于 5 天前

用python写程序,棒

寒哥Gh61ac8 发表于 5 天前

摸鱼必备,能实现鼠标移开范围后,整个窗口隐藏吗

寒哥Gh61ac8 发表于 5 天前

呵呵~有点意思

风之影赫 发表于 5 天前

那得先想想,想唤出界面时怎么操作啊
页: [1] 2
查看完整版本: 自制上班摸鱼pdf阅读器-更新3.0自动隐藏版本