2013-07-26 1 views
3

J'ai un simple programme de peinture python tkinter (l'utilisateur utilise la souris pour dessiner sur la toile). Mon objectif est de sauvegarder le dessin final et de le mettre dans un fichier pdf avec d'autres contenus.Python tkinter enregistrer canvas comme post-scriptum et ajouter au pdf

Après avoir regardé autour, je réalisais que je ne peux enregistrer le dessin de la toile sous forme de fichier postscript comme celui-ci

canvas.postscript(file="file_name.ps", colormode='color')

Alors, je me demande s'il y a un moyen (tout module python?) Qui permettra moi d'insérer les fichiers postscript dans le fichier pdf en tant qu'images.

Est-ce possible?

+1

Je renvoie à [ce] (http://stackoverflow.com/questions/2252726/how-to- create-pdf-files-in-python) question pour info sur les modules qui peuvent le faire. Bonne chance! –

Répondre

5

Comme il est mentionné dans this answer, un walkaround possible est d'ouvrir un sous-processus à utiliser ghostscript:

canvas.postscript(file="tmp.ps", colormode='color') 
process = subprocess.Popen(["ps2pdf", "tmp.ps", "result.pdf"], shell=True) 

Une autre solution serait d'utiliser ReportLab, mais depuis sa addPostScriptCommand est pas très fiable, je pense que vous Vous devrez d'abord utiliser le Python Imaging Library pour convertir le fichier PS en une image, puis l'ajouter au ReportLab Canvas. Cependant, je suggère l'approche ghostscript.

Ceci est une preuve de base du concept que je l'habitude de voir si cela fonctionne:

""" 
Setup for Ghostscript 9.07: 

Download it from http://www.ghostscript.com/GPL_Ghostscript_9.07.html 
and add `/path/to/gs9.07/bin/` and `/path/to/gs9.07/lib/` to your path. 
""" 

import Tkinter as tk 
import subprocess 
import os 

class App(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.title("Canvas2PDF") 
     self.line_start = None 
     self.canvas = tk.Canvas(self, width=300, height=300, bg="white") 
     self.canvas.bind("<Button-1>", lambda e: self.draw(e.x, e.y)) 
     self.button = tk.Button(self, text="Generate PDF", 
           command=self.generate_pdf) 
     self.canvas.pack() 
     self.button.pack(pady=10) 

    def draw(self, x, y): 
     if self.line_start: 
      x_origin, y_origin = self.line_start 
      self.canvas.create_line(x_origin, y_origin, x, y) 
      self.line_start = None 
     else: 
      self.line_start = (x, y) 

    def generate_pdf(self): 
     self.canvas.postscript(file="tmp.ps", colormode='color') 
     process = subprocess.Popen(["ps2pdf", "tmp.ps", "result.pdf"], shell=True) 
     process.wait() 
     os.remove("tmp.ps") 
     self.destroy() 

app = App() 
app.mainloop()