Search code examples
pythonpdfviewtkintertk-toolkit

PDF Viewer for Python Tkinter


I am currently looking for a possibility to display PDF Files inside a Tkinter application (displaying them e.g. in a Frame widget or similar).

Is there already a solution for this problem?

I already searched SO, used ddg an others but did not find anything for that purpose. Only thing I found was how to print the contents of a tk.Canvas to PDF - is there a way to load a PDF into a Canvas?


Solution

  • !!! ATTENTION !!!
    !!! THIS ONLY WORKS FOR PYTHON 2 !!!!

    I am currently working on an update for python3

    viranthas pypdfocr is not working properly with python 3.
    For use with python 2, happily use the version below.

    Finally I came to a solution I can work with.

    Using pypdfocr and its pypdfocr_gs library I call

    pypdfocr.pypdfocr_gs.PyGs({}).make_img_from_pdf(pdf_file)

    to retrieve jpg images and then I use PIL to get ImageTk.PhotoImage instances from it and use them in my code.

    ImageTk.PhotoImage(_img_file_handle)
    

    Will add a proper example as soon as I can.

    Edit:

    As promised here comes the code

    
        import pypdfocr.pypdfocr_gs as pdfImg
        from PIL import Image, ImageTk
        import Tkinter as tk
        import ttk
    
        import glob, os
    
        root=tk.Tk()
    
        __f_tmp=glob.glob(pdfImg.PyGs({}).make_img_from_pdf("\tmp\test.pdf")[1])[0]
        #                             ^ this is needed for a "default"-Config
        __img=Image.open(__f_tmp)
    
        __tk_img=ImageTk.PhotoImage(__img)
    
        ttk.Label(root, image=__tk_img).grid()
    
        __img.close()
        os.remove(__f_tmp)
    
        root.mainloop()
    

    Edit:

    Using viranthas pypdfocr version there seems to be a bug inside the handling of Windows 10 and pythons subprocess:

    # extract from pypdfocr_gs:
    def _run_gs(self, options, output_filename, pdf_filename):
            try:
                cmd = '%s -q -dNOPAUSE %s -sOutputFile="%s" "%s" -c quit' % (self.binary, options, output_filename, pdf_filename)
    
                logging.info(cmd)        
    
                # Change this line for Windows 10:
                # out = subprocess.check_output(cmd, shell=True)
                out = subprocess.check_output(cmd)
    # end of extract