图形输出为空白的PostScript文件

1 投票
1 回答
567 浏览
提问于 2025-04-16 20:32

我在一个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 个回答

0

问题在于 wxmpl 没有调用 HasPage 这个方法——之前提到的所有改动其实都没什么用。把下面这段代码加到 FigurePrintout 类里,就解决了无法打印的问题:

def HasPage(self, page):
    return page <= 1

没错,就两行代码。根据 wxPython 打印框架的文档,默认情况下 return page == 1,但是 wxmpl 在它的 GetPageInfo 方法中返回的是 0,表示第一页。所以打印机根本不知道它有页面可以打印。

撰写回答