diff --git a/app/src/boot/onGetConfig.ts b/app/src/boot/onGetConfig.ts index dc2f4f1f7..b0c846ccd 100644 --- a/app/src/boot/onGetConfig.ts +++ b/app/src/boot/onGetConfig.ts @@ -221,9 +221,6 @@ export const initWindow = async (app: App) => { }); ipcRenderer.on(Constants.SIYUAN_EXPORT_PDF, async (e, ipcData) => { const msgId = showMessage(window.siyuan.languages.exporting, -1); - const isPaged = ipcData.paged !== undefined ? ipcData.paged : true; - // 分页模式下 pageSize 是字符串,不分页模式下是对象,统一使用 pageSizeValue 获取原始页面大小 - const pageSizeValue = ipcData.pageSizeValue !== undefined ? ipcData.pageSizeValue : (isPaged ? ipcData.pdfOptions.pageSize : "A4"); window.siyuan.storage[Constants.LOCAL_EXPORTPDF] = { removeAssets: ipcData.removeAssets, keepFold: ipcData.keepFold, @@ -231,17 +228,17 @@ export const initWindow = async (app: App) => { watermark: ipcData.watermark, landscape: ipcData.pdfOptions.landscape, marginType: ipcData.pdfOptions.marginType, - pageSize: pageSizeValue, + pageSize: ipcData.pageSize, scale: ipcData.pdfOptions.scale, marginTop: ipcData.pdfOptions.margins.top, marginRight: ipcData.pdfOptions.margins.right, marginBottom: ipcData.pdfOptions.margins.bottom, marginLeft: ipcData.pdfOptions.margins.left, - paged: isPaged, + paged: ipcData.paged, }; setStorageVal(Constants.LOCAL_EXPORTPDF, window.siyuan.storage[Constants.LOCAL_EXPORTPDF]); try { - if (window.siyuan.config.export.pdfFooter.trim() && isPaged) { + if (window.siyuan.config.export.pdfFooter.trim()) { const response = await fetchSyncPost("/api/template/renderSprig", {template: window.siyuan.config.export.pdfFooter}); ipcData.pdfOptions.displayHeaderFooter = true; ipcData.pdfOptions.headerTemplate = ""; diff --git a/app/src/protyle/export/index.ts b/app/src/protyle/export/index.ts index 07c5d3aa0..f509900a7 100644 --- a/app/src/protyle/export/index.ts +++ b/app/src/protyle/export/index.ts @@ -137,6 +137,9 @@ const getSnippetJS = () => { /// #if !BROWSER const renderPDF = async (id: string) => { const localData = window.siyuan.storage[Constants.LOCAL_EXPORTPDF]; + if (typeof localData.paged === "undefined") { + localData.paged = true; + } const servePathWithoutTrailingSlash = window.location.protocol + "//" + window.location.host; const servePath = servePathWithoutTrailingSlash + "/"; const isDefault = (window.siyuan.config.appearance.mode === 1 && window.siyuan.config.appearance.themeDark === "midnight") || (window.siyuan.config.appearance.mode === 0 && window.siyuan.config.appearance.themeLight === "daylight"); @@ -304,7 +307,7 @@ const renderPDF = async (id: string) => { ${window.siyuan.languages.exportPDF1} - +
@@ -593,62 +596,47 @@ ${getIconScript(servePath)} setPadding(); }); actionElement.querySelector("#landscape").addEventListener('change', (e) => { - if (e.target.checked) { - actionElement.querySelector("#paged").checked = true; - } setPadding(); }); - actionElement.querySelector("#paged").addEventListener('change', (e) => { - // 不分页模式没有适配横向页面,强制纵向 - if (!e.target.checked) { - const landscapeElement = actionElement.querySelector("#landscape"); - if (landscapeElement.checked) { - landscapeElement.checked = false; - setPadding(); - } - } - }); actionElement.querySelector('.b3-button--cancel').addEventListener('click', () => { const {ipcRenderer} = require("electron"); ipcRenderer.send("${Constants.SIYUAN_CMD}", "destroy") }); + const buildExportConfig = (unPagedPageSize) => { + const pageSize = actionElement.querySelector("#pageSize").value; + // https://www.electronjs.org/docs/latest/api/web-contents#contentsprinttopdfoptions + // https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF + return { + title: "${window.siyuan.languages.export} PDF", + pdfOptions: { + printBackground: true, + landscape: actionElement.querySelector("#landscape").checked, + marginType: actionElement.querySelector("#marginsType").value, + margins: { + top: parseFloat(document.querySelector("#marginsTop").value) || 0, + bottom: parseFloat(document.querySelector("#marginsBottom").value) || 0, + left: parseFloat(document.querySelector("#marginsLeft").value) || 0, + right: parseFloat(document.querySelector("#marginsRight").value) || 0, + }, + scale: parseFloat(actionElement.querySelector("#scale").value), + pageSize: unPagedPageSize || pageSize, + }, + pageSize, + keepFold: keepFoldElement.checked, + mergeSubdocs: mergeSubdocsElement.checked, + watermark: watermarkElement.checked, + removeAssets: actionElement.querySelector("#removeAssets").checked, + paged: !unPagedPageSize, + rootId: "${id}", + rootTitle: response.data.name, + parentWindowId: ${currentWindowId}, + }; + }; actionElement.querySelector('.b3-button--text').addEventListener('click', () => { const {ipcRenderer} = require("electron"); - const pageSizeValue = actionElement.querySelector("#pageSize").value; const isPaged = actionElement.querySelector("#paged").checked; - - const buildExportConfig = (pageSize) => { - // https://www.electronjs.org/docs/latest/api/web-contents#contentsprinttopdfoptions - // https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF - return { - title: "${window.siyuan.languages.export} PDF", - pdfOptions: { - printBackground: true, - landscape: actionElement.querySelector("#landscape").checked, - marginType: actionElement.querySelector("#marginsType").value, - margins: { - top: parseFloat(document.querySelector("#marginsTop").value) || 0, - bottom: parseFloat(document.querySelector("#marginsBottom").value) || 0, - left: parseFloat(document.querySelector("#marginsLeft").value) || 0, - right: parseFloat(document.querySelector("#marginsRight").value) || 0, - }, - scale: parseFloat(actionElement.querySelector("#scale").value), - pageSize: pageSize, - }, - keepFold: keepFoldElement.checked, - mergeSubdocs: mergeSubdocsElement.checked, - watermark: watermarkElement.checked, - removeAssets: actionElement.querySelector("#removeAssets").checked, - paged: isPaged, - pageSizeValue: pageSizeValue, - rootId: "${id}", - rootTitle: response.data.name, - parentWindowId: ${currentWindowId}, - }; - }; - if (!isPaged) { - const getPageSizeDimensions = (pageSizeName) => { + const getPageSizeDimensions = () => { // https://github.com/electron/electron/blob/3df3a6a736b93e0d69fa3b0c403b33f201287780/lib/browser/api/web-contents.ts#L89-L101 const pageSizes = { "A3": { width: 11.7, height: 16.54 }, @@ -658,26 +646,18 @@ ${getIconScript(servePath)} "Letter": { width: 8.5, height: 11 }, "Tabloid": { width: 11, height: 17 }, }; - return pageSizes[pageSizeName] || pageSizes["A4"]; + return pageSizes[actionElement.querySelector("#pageSize").value]; }; - - const previewContent = previewElement.querySelector(".protyle-wysiwyg") || previewElement; - const contentHeight = previewContent.scrollHeight || previewContent.offsetHeight; - // 英寸 = 像素 / PPI,但不知道 PPI 怎么得到,直接使用经典 96 DPI,实际导出之后页面末尾会有空白 - const heightInches = contentHeight / 96; - // 获取页面大小对应的宽度 - const selectedPageSize = getPageSizeDimensions(pageSizeValue); - // 高度根据内容动态计算 - const marginTop = parseFloat(document.querySelector("#marginsTop").value) || 0; - const marginBottom = parseFloat(document.querySelector("#marginsBottom").value) || 0; - const totalHeightInches = heightInches + marginTop + marginBottom; - const dynamicPageSize = { - width: selectedPageSize.width, - height: totalHeightInches - }; - ipcRenderer.send("${Constants.SIYUAN_EXPORT_PDF}", buildExportConfig(dynamicPageSize)); + const previewHeight = previewElement.scrollHeight / 96 - (parseFloat(document.querySelector("#marginsTop").value) || 0) - (parseFloat(document.querySelector("#marginsBottom").value) || 0); + ipcRenderer.send("${Constants.SIYUAN_EXPORT_PDF}", buildExportConfig(actionElement.querySelector("#landscape").checked ? { + height: getPageSizeDimensions().height, + width: previewHeight, + } : { + width: getPageSizeDimensions().width, + height: previewHeight, + })); } else { - ipcRenderer.send("${Constants.SIYUAN_EXPORT_PDF}", buildExportConfig(pageSizeValue)); + ipcRenderer.send("${Constants.SIYUAN_EXPORT_PDF}", buildExportConfig()); } previewElement.classList.add("exporting"); previewElement.style.zoom = "";