基于Python開發(fā)一個PDF文件元數(shù)據(jù)查看器
更新時間:2026年01月07日 09:25:14 作者:bosins
這篇文章主要介紹了如何基于Python開發(fā)PDF文件元數(shù)據(jù)查看器,包括作者信息、創(chuàng)建或修改日期、所用產(chǎn)品信息等,文中有完整的代碼示例供大家參考,需要的朋友可以參考下
下面是一個完整的Python GUI程序,用于查看PDF文件的元數(shù)據(jù)(包括作者信息),使用Tkinter作為GUI框架。這個程序可以提取PDF的作者、標題、創(chuàng)建日期等信息。
完整代碼
(有需要運行版軟件的留言郵箱):
import os
import PyPDF2
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from tkinter.scrolledtext import ScrolledText
class PDFMetadataViewer:
def __init__(self, root):
self.root = root
self.root.title("PDF元數(shù)據(jù)查看器")
self.root.geometry("700x500")
self.root.configure(bg="#f5f5f5")
# 創(chuàng)建主框架
main_frame = ttk.Frame(root, padding="20")
main_frame.pack(fill=tk.BOTH, expand=True)
# 標題
title_label = ttk.Label(main_frame, text="PDF元數(shù)據(jù)查看器", font=("Arial", 16, "bold"))
title_label.pack(pady=(0, 15))
# 說明文字
info_label = ttk.Label(main_frame,
text="選擇PDF文件以查看其元數(shù)據(jù)信息(作者、標題、創(chuàng)建日期等)",
foreground="gray",
font=("Arial", 10))
info_label.pack(anchor="w")
# 選擇文件按鈕
self.btn_browse = ttk.Button(main_frame, text="選擇PDF文件", command=self.browse_file, width=20)
self.btn_browse.pack(pady=10)
# 顯示區(qū)域
self.text_area = ScrolledText(main_frame, wrap=tk.WORD, font=("Arial", 10), state=tk.DISABLED)
self.text_area.pack(fill=tk.BOTH, expand=True, pady=5)
# 操作按鈕
btn_frame = ttk.Frame(main_frame)
btn_frame.pack(pady=5)
self.btn_save = ttk.Button(btn_frame, text="保存為文本文件", command=self.save_to_file, width=20)
self.btn_save.pack(side=tk.LEFT, padx=5)
self.btn_clear = ttk.Button(btn_frame, text="清除顯示", command=self.clear_display, width=20)
self.btn_clear.pack(side=tk.LEFT, padx=5)
# 狀態(tài)欄
self.status_var = tk.StringVar()
self.status_var.set("就緒 - 請選擇PDF文件")
self.status_bar = ttk.Label(root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)
self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
# 信息提示
info_note = ttk.Label(main_frame,
text="注意:PDF文件中不包含計算機MAC地址信息,這些信息僅來自PDF的元數(shù)據(jù)",
foreground="red",
font=("Arial", 9))
info_note.pack(pady=(10, 0), anchor="w")
def browse_file(self):
"""打開文件選擇對話框"""
file_path = filedialog.askopenfilename(
title="選擇PDF文件",
filetypes=[("PDF文件", "*.pdf"), ("所有文件", "*.*")]
)
if file_path:
self.display_metadata(file_path)
def display_metadata(self, file_path):
"""顯示PDF元數(shù)據(jù)"""
try:
self.text_area.config(state=tk.NORMAL)
self.text_area.delete(1.0, tk.END)
# 提取元數(shù)據(jù)
metadata = self.get_pdf_metadata(file_path)
if '錯誤' in metadata:
self.text_area.insert(tk.END, f"錯誤: {metadata['錯誤']}")
else:
# 顯示元數(shù)據(jù)
self.text_area.insert(tk.END, f"PDF文件: {os.path.basename(file_path)}\n")
self.text_area.insert(tk.END, f"文件路徑: {file_path}\n")
self.text_area.insert(tk.END, f"{'-'*50}\n")
self.text_area.insert(tk.END, "元數(shù)據(jù)信息:\n")
self.text_area.insert(tk.END, f"作者: {metadata.get('作者', '未指定')}\n")
self.text_area.insert(tk.END, f"標題: {metadata.get('標題', '未指定')}\n")
self.text_area.insert(tk.END, f"創(chuàng)建日期: {metadata.get('創(chuàng)建日期', '未指定')}\n")
self.text_area.insert(tk.END, f"修改日期: {metadata.get('修改日期', '未指定')}\n")
self.text_area.insert(tk.END, f"主題: {metadata.get('主題', '未指定')}\n")
self.text_area.insert(tk.END, f"關鍵詞: {metadata.get('關鍵詞', '未指定')}\n")
self.text_area.insert(tk.END, f"產(chǎn)品: {metadata.get('產(chǎn)品', '未指定')}\n")
self.text_area.config(state=tk.DISABLED)
self.status_var.set(f"已加載: {os.path.basename(file_path)}")
except Exception as e:
self.text_area.config(state=tk.NORMAL)
self.text_area.delete(1.0, tk.END)
self.text_area.insert(tk.END, f"錯誤: {str(e)}")
self.text_area.config(state=tk.DISABLED)
self.status_var.set("錯誤: 無法加載文件")
def get_pdf_metadata(self, file_path):
"""獲取PDF元數(shù)據(jù)"""
try:
with open(file_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
if pdf_reader.metadata:
return {
'作者': pdf_reader.metadata.get('/Author', '未指定'),
'標題': pdf_reader.metadata.get('/Title', '未指定'),
'創(chuàng)建日期': pdf_reader.metadata.get('/CreationDate', '未指定'),
'修改日期': pdf_reader.metadata.get('/ModDate', '未指定'),
'主題': pdf_reader.metadata.get('/Subject', '未指定'),
'關鍵詞': pdf_reader.metadata.get('/Keywords', '未指定'),
'產(chǎn)品': pdf_reader.metadata.get('/Producer', '未指定')
}
else:
return {'錯誤': 'PDF文件不包含元數(shù)據(jù)'}
except Exception as e:
return {'錯誤': str(e)}
def save_to_file(self):
"""保存元數(shù)據(jù)到文本文件"""
if self.text_area.cget("state") == tk.DISABLED:
# 獲取當前顯示的文本
text = self.text_area.get(1.0, tk.END)
# 移除末尾的換行符
text = text.strip()
if not text or "錯誤" in text or "未指定" in text:
messagebox.showinfo("提示", "沒有可保存的元數(shù)據(jù)")
return
# 選擇保存位置
save_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")],
initialfile="pdf_metadata.txt"
)
if save_path:
try:
with open(save_path, 'w', encoding='utf-8') as f:
f.write(text)
messagebox.showinfo("成功", f"元數(shù)據(jù)已保存到: {save_path}")
self.status_var.set(f"已保存到: {os.path.basename(save_path)}")
except Exception as e:
messagebox.showerror("錯誤", f"無法保存文件: {str(e)}")
else:
messagebox.showinfo("提示", "請先加載一個PDF文件")
def clear_display(self):
"""清除顯示區(qū)域"""
self.text_area.config(state=tk.NORMAL)
self.text_area.delete(1.0, tk.END)
self.text_area.config(state=tk.DISABLED)
self.status_var.set("已清除顯示內(nèi)容")
if __name__ == "__main__":
try:
# 檢查是否安裝了PyPDF2
import PyPDF2
except ImportError:
# 如果沒有安裝PyPDF2,提示用戶安裝
messagebox.showerror("缺少庫", "需要安裝PyPDF2庫。請運行: pip install PyPDF2")
exit(1)
root = tk.Tk()
app = PDFMetadataViewer(root)
root.mainloop()
使用說明
1.安裝依賴:
pip install PyPDF2
2.運行程序:
- 點擊"選擇PDF文件"按鈕
- 從文件瀏覽器中選擇一個PDF文件
- 程序將顯示PDF的元數(shù)據(jù)信息
功能說明
- 元數(shù)據(jù)提?。簭腜DF中提取作者、標題、創(chuàng)建日期、修改日期等信息
- 用戶友好界面:使用Tkinter創(chuàng)建的GUI,簡單直觀
- 錯誤處理:處理常見錯誤(如文件不存在、PDF格式錯誤等)
界面展示

到此這篇關于基于Python開發(fā)一個PDF文件元數(shù)據(jù)查看器的文章就介紹到這了,更多相關Python PDF文件元數(shù)據(jù)查看內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python和JS反爬之解決反爬參數(shù)?signKey
這篇文章主要介紹了Python和JS反爬之解決反爬參數(shù)?signKey,Python?反爬中有一大類,叫做字體反爬,核心的理論就是通過字體文件或者?CSS?偏移,接下來文章的詳細介紹,需要的小伙伴可以參考一下2022-05-05
python之從文件讀取數(shù)據(jù)到list的實例講解
下面小編就為大家分享一篇python之從文件讀取數(shù)據(jù)到list的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

