Пустые постскриптумные файлы из сюжета - PullRequest
1 голос
/ 29 июня 2011

У меня есть фигура 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 (да, я знаю, что она ужасно устарела, но сейчас я должен работать с ней)

1 Ответ

0 голосов
/ 01 июля 2011

Проблема заключалась в том, что wxmpl не обращался к HasPage - в конце концов, все вышеперечисленные изменения не имели значения.Добавление в этот код в классе FigurePrintout исправило проблему отсутствия печати:

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

Да ... две строки.Исходя из документации для инфраструктуры печати wxPython, по умолчанию используется return page == 1, но wxmpl возвращает 0 в качестве первой страницы в переопределении GetPageInfo.Поэтому принтер не думал, что у него есть страница для печати. ​​

...