You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:55:23