使用tkPDFViewer无法显示PDF:'Page'对象无getPixmap属性异常
解决tkPDFViewer中'Page' object has no attribute 'getPixmap'错误
这个错误是因为tkPDFViewer依赖的PyMuPDF库版本更新后API命名规则变化导致的——旧版本PyMuPDF里Page对象的getPixmap()方法,在新版本中被改为get_pixmap()(下划线小写命名),而tkPDFViewer的源码未适配该变更。
以下是几种可行的解决方法:
修改tkPDFViewer源码适配新版本
找到tkPDFViewer安装路径下的tkPDFViewer.py文件(例如你的路径是/home/shana/anaconda3/lib/python3.8/site-packages/tkPDFViewer/tkPDFViewer.py),打开后定位到第46行,将pix = page.getPixmap()修改为pix = page.get_pixmap(),保存后重启程序即可。降级PyMuPDF到兼容版本
若不想修改源码,可直接降级PyMuPDF到仍支持getPixmap()方法的旧版本,比如1.19.x系列:pip install pymupdf==1.19.6直接用PyMuPDF结合Tkinter显示PDF
跳过tkPDFViewer,直接通过PyMuPDF和Tkinter实现PDF显示,示例代码如下:import fitz import tkinter as tk from tkinter import ttk class PDFViewer(tk.Tk): def __init__(self, pdf_path): super().__init__() self.title("PDF Viewer") self.pdf_doc = fitz.open(pdf_path) self.current_page = 0 # 创建画布用于显示PDF页面 self.canvas = tk.Canvas(self) self.canvas.pack(fill=tk.BOTH, expand=True) # 翻页按钮区域 self.frame = ttk.Frame(self) self.frame.pack(fill=tk.X, padx=5, pady=5) ttk.Button(self.frame, text="上一页", command=self.prev_page).pack(side=tk.LEFT) ttk.Button(self.frame, text="下一页", command=self.next_page).pack(side=tk.RIGHT) self.show_page() def show_page(self): self.canvas.delete("all") page = self.pdf_doc[self.current_page] pix = page.get_pixmap() img = tk.PhotoImage(data=pix.tobytes("ppm")) self.canvas.create_image(0, 0, anchor=tk.NW, image=img) self.canvas.image = img # 保留引用避免图像被垃圾回收 def prev_page(self): if self.current_page > 0: self.current_page -= 1 self.show_page() def next_page(self): if self.current_page < len(self.pdf_doc) - 1: self.current_page += 1 self.show_page() if __name__ == "__main__": app = PDFViewer("your_pdf_file.pdf") app.mainloop()把代码中的
your_pdf_file.pdf替换为你的PDF文件路径即可运行。
内容的提问来源于stack exchange,提问作者manj
相关产品推荐
相关产品推荐

