diff --git a/ipympl/backend_nbagg.py b/ipympl/backend_nbagg.py index e740cef8..7aeed973 100644 --- a/ipympl/backend_nbagg.py +++ b/ipympl/backend_nbagg.py @@ -147,11 +147,13 @@ def _default_toolitems(self): 'move': 'arrows', 'download': 'floppy-o', 'export': 'file-picture-o', + 'make_pdf': 'file-pdf', } download_item = ('Download', 'Download plot', 'download', 'save_figure') + make_pdf = ('Create pdf', 'Create pdf from figure', 'make_pdf', 'makepdf') - toolitems = NavigationToolbar2.toolitems + (download_item,) + toolitems = NavigationToolbar2.toolitems + (download_item,) + (make_pdf,) return [ (text, tooltip, icons[icon_name], method_name) @@ -275,6 +277,9 @@ def _handle_message(self, object, content, buffers): Canvas.current_dpi_ratio = content['dpi_ratio'] self.manager.handle_json(content) + elif content['type'] == 'toolbar_button' and content['name'] == 'makepdf': + self._send_savefig_pdf() + else: self.manager.handle_json(content) @@ -450,6 +455,11 @@ def handle_key(key): handle_key_press = handle_key_release = _handle_key + def _send_savefig_pdf(self): + buf = io.BytesIO() + self.figure.savefig(buf, format='pdf', dpi='figure') + self.send({'data': '{"type": "makepdf"}'}, buffers=[buf.getbuffer()]) + class FigureManager(FigureManagerWebAgg): if matplotlib.__version__ < "3.6": diff --git a/src/mpl_widget.ts b/src/mpl_widget.ts index 9814a90f..553b466e 100644 --- a/src/mpl_widget.ts +++ b/src/mpl_widget.ts @@ -157,6 +157,14 @@ export class MPLCanvasModel extends DOMWidgetModel { document.body.removeChild(save); } + handle_makepdf(msg: any, dataviews: any) { + const url_creator = window.URL || window.webkitURL; + const buffer = new Uint8Array(dataviews[0].buffer); + const blob = new Blob([buffer], { type: 'application/pdf' }); + const image_url = url_creator.createObjectURL(blob); + window.open(image_url, '_blank'); + } + handle_resize(msg: { [index: string]: any }) { this.resize_canvas(); this.offscreen_context.drawImage(this.image, 0, 0);