У меня есть фигура matplotlib внутри панели wxmpl, и я пытаюсь распечатать ее в файл 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
Google привел меня к этой строке электронной почты , и, соответственно, я попытался заменить вышеуказанную строку на:
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 (да, я знаю, что она ужасно устарела, но сейчас я должен работать с ней)