From 0f7826d6d04c48f4d1824158e22c52364ee88e18 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 31 Jan 2025 21:44:59 +0200 Subject: [PATCH] feat(print): implement basic export as PDF support --- src/public/app/widgets/note_detail.js | 4 +++- src/services/window.ts | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/public/app/widgets/note_detail.js b/src/public/app/widgets/note_detail.js index ae38b1b93..8b4b5bb66 100644 --- a/src/public/app/widgets/note_detail.js +++ b/src/public/app/widgets/note_detail.js @@ -32,6 +32,7 @@ import AttachmentDetailTypeWidget from "./type_widgets/attachment_detail.js"; import MindMapWidget from "./type_widgets/mind_map.js"; import { getStylesheetUrl, isSyntaxHighlightEnabled } from "../services/syntax_highlight.js"; import GeoMapTypeWidget from "./type_widgets/geo_map.js"; +import utils from "../services/utils.js"; const TPL = `
@@ -296,7 +297,8 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { return; } - alert("Hi"); + const { ipcRenderer } = utils.dynamicRequire("electron"); + ipcRenderer.send("export-as-pdf"); } hoistedNoteChangedEvent({ ntxId }) { diff --git a/src/services/window.ts b/src/services/window.ts index 84c8f5a46..897a6e4da 100644 --- a/src/services/window.ts +++ b/src/services/window.ts @@ -1,3 +1,4 @@ +import fs from "fs"; import path from "path"; import url from "url"; import port from "./port.js"; @@ -7,8 +8,8 @@ import sqlInit from "./sql_init.js"; import cls from "./cls.js"; import keyboardActionsService from "./keyboard_actions.js"; import remoteMain from "@electron/remote/main/index.js"; -import type { App, BrowserWindow, BrowserWindowConstructorOptions, WebContents } from "electron"; -import { ipcMain } from "electron"; +import { BrowserWindow, type App, type BrowserWindowConstructorOptions, type WebContents } from "electron"; +import { dialog, ipcMain } from "electron"; import { isDev, isMac, isWindows } from "./utils.js"; import { fileURLToPath } from "url"; @@ -46,6 +47,24 @@ ipcMain.on("create-extra-window", (event, arg) => { createExtraWindow(arg.extraWindowHash); }); +ipcMain.on("export-as-pdf", async (e) => { + const browserWindow = BrowserWindow.fromWebContents(e.sender); + if (!browserWindow) { + return; + } + + const filePath = dialog.showSaveDialogSync(browserWindow, {}); + if (!filePath) { + return; + } + + // TODO: Report if there is an error in generating the PDF. + const buffer = await browserWindow.webContents.printToPDF({}); + + // TODO: Report if there was an error in saving the PDF. + fs.writeFileSync(filePath, buffer); +}); + async function createMainWindow(app: App) { if ("setUserTasks" in app) { app.setUserTasks([