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);