Python tkinter save canvas as postscript and add to pdf

匿名 (未验证) 提交于 2019-12-03 08:48:34

问题:

I have a simple python tkinter paint program (user use mouse to draw on the canvas). My objective is to save the final drawing and put it into a pdf file with other contents.

After looking around, i realized that i can only save the canvas drawing as postscript file like this

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

So, i am wondering if there's any way (any python module?) that will allow me to insert the postscript files into pdf file as images.

Is it possible?

回答1:

As it is mentioned in this answer, a possible walkaround is to open a subprocess to use ghostscript:

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

Another solution would be to use ReportLab, but since its addPostScriptCommand is not very reliable, I think you'll have to use the Python Imaging Library to convert the PS file to an image first, and then add it to the ReportLab Canvas. However, I'd suggest the ghostscript approach.

This is a basic proof of concept I used to see if it works:

""" 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() 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!