图形输出为空白的PostScript文件
我在一个wxmpl面板里放了一个matplotlib图形,现在想把它打印成一个Postscript文件。结果我得到的文件是空白的——这里的“空白”不是指完全没有内容,而是说这个.ps文件有头部信息,但打开后显示的就是一张空白页。
打印的代码是:
printer = self.GetPrinter() # wxmpl.FigurePrinter
fig = self.get_figure() # matplotlib.figure.Figure
printData = wx.PrintData(printer.getPrintData())
printer.printFigure(fig, "Plot")
self.printer.setPrintData(printData) # reset print data (avoid segfaults)
我查看了wxmpl的代码,发现OnPrintPage
这个函数从来没有被调用过,于是我尝试通过wxmpl.FigurePrintout.OnBeginDocument
来添加一个调用。这样一来,OnPrintPage
就执行到了这一行:
self.GetDC().DrawBitmap(image.ConvertToBitmap(), wM_Dx, hM_Dx, False)
结果出现了一个错误:
wx._core.PyAssertionError
C++ assertion "wxAssertFailure" failed in ../src/generic/dcpsg.cpp(2238): invalid postscript dc
我在谷歌上找到了一些信息,指向了这个邮件讨论串,于是我尝试把上面那行代码替换成:
dc = self.GetDC()
dc.StartDoc("printing stuff")
dc.StartPage()
dc.BeginDrawing()
dc.DrawBitmap(image.ConvertToBitmap(), wM_Dx, hM_Dx, False)
dc.EndDrawing()
dc.EndPage()
dc.EndDoc()
这样做后错误消失了——但经过这些努力,打印出来的文件还是和之前一样,依然是空白的。
还有一点,直接把图保存为Postscript文件是没问题的——那是用的不同的后端(FigureCanvasWxAgg而不是RendererAgg,所以问题可能出在matplotlib而不是wxmpl/wxPython上?)。不过,我还需要把这个打印到实际的打印机上,所以单独处理.ps文件并不是一个可行的解决方案。
我在使用Linux
wxmpl版本 1.2.9
wxPython版本 2.6.4.0
matplotlib版本 0.84(是的,我知道这个版本非常过时,但目前只能用这个)
1 个回答
问题在于 wxmpl 没有调用 HasPage
这个方法——之前提到的所有改动其实都没什么用。把下面这段代码加到 FigurePrintout
类里,就解决了无法打印的问题:
def HasPage(self, page):
return page <= 1
没错,就两行代码。根据 wxPython 打印框架的文档,默认情况下 return page == 1
,但是 wxmpl 在它的 GetPageInfo
方法中返回的是 0,表示第一页。所以打印机根本不知道它有页面可以打印。