mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-18 07:30:12 +01:00
✨ Support adding the watermark on export PDF https://github.com/siyuan-note/siyuan/issues/9961
This commit is contained in:
parent
4fdaae2892
commit
94cc8b2e3b
9 changed files with 57 additions and 10 deletions
|
|
@ -941,6 +941,9 @@
|
||||||
"export24": "After enabling, add some general metadata information at the beginning of the exported Markdown file",
|
"export24": "After enabling, add some general metadata information at the beginning of the exported Markdown file",
|
||||||
"export25": "Export Word .docx template path",
|
"export25": "Export Word .docx template path",
|
||||||
"export26": "The absolute path of the template used when exporting Word .docx files, that is, Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank \">--reference-doc</a> parameter value",
|
"export26": "The absolute path of the template used when exporting Word .docx files, that is, Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank \">--reference-doc</a> parameter value",
|
||||||
|
"export27": "Export PDF watermark",
|
||||||
|
"export28": "Watermark text or watermark file path",
|
||||||
|
"export29": "Watermark position, size and style, etc.",
|
||||||
"theme11": "Use theme in light mode",
|
"theme11": "Use theme in light mode",
|
||||||
"theme12": "Use theme in dark mode",
|
"theme12": "Use theme in dark mode",
|
||||||
"theme2": "Select the icons used in the user interface",
|
"theme2": "Select the icons used in the user interface",
|
||||||
|
|
|
||||||
|
|
@ -941,6 +941,9 @@
|
||||||
"export24": "Después de habilitar, agregue información general de metadatos al comienzo del archivo Markdown exportado",
|
"export24": "Después de habilitar, agregue información general de metadatos al comienzo del archivo Markdown exportado",
|
||||||
"export25": "Exportar ruta de plantilla .docx de Word",
|
"export25": "Exportar ruta de plantilla .docx de Word",
|
||||||
"export26": "La ruta absoluta de la plantilla utilizada al exportar archivos .docx de Word, es decir, Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target =\"_blank\">--reference-doc</a> valor del parámetro",
|
"export26": "La ruta absoluta de la plantilla utilizada al exportar archivos .docx de Word, es decir, Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target =\"_blank\">--reference-doc</a> valor del parámetro",
|
||||||
|
"export27": "Exportar marca de agua PDF",
|
||||||
|
"export28": "Texto de marca de agua o ruta del archivo de marca de agua",
|
||||||
|
"export29": "Posición, tamaño y estilo de la marca de agua, etc.",
|
||||||
"theme11": "Usar tema en modo claro",
|
"theme11": "Usar tema en modo claro",
|
||||||
"theme12": "Usar tema en modo oscuro",
|
"theme12": "Usar tema en modo oscuro",
|
||||||
"theme2": "Selecciona los iconos utilizados en la interfaz de usuario",
|
"theme2": "Selecciona los iconos utilizados en la interfaz de usuario",
|
||||||
|
|
|
||||||
|
|
@ -941,6 +941,9 @@
|
||||||
"export24": "Après l'activation, ajoutez des informations générales sur les métadonnées au début du fichier Markdown exporté",
|
"export24": "Après l'activation, ajoutez des informations générales sur les métadonnées au début du fichier Markdown exporté",
|
||||||
"export25": "Chemin d'exportation du modèle Word .docx",
|
"export25": "Chemin d'exportation du modèle Word .docx",
|
||||||
"export26": "Le chemin absolu du modèle utilisé lors de l'exportation de fichiers Word .docx, c'est-à-dire Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target =\"_blank\">--reference-doc</a> valeur du paramètre",
|
"export26": "Le chemin absolu du modèle utilisé lors de l'exportation de fichiers Word .docx, c'est-à-dire Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target =\"_blank\">--reference-doc</a> valeur du paramètre",
|
||||||
|
"export27": "Exporter le filigrane PDF",
|
||||||
|
"export28": "Texte du filigrane ou chemin du fichier de filigrane",
|
||||||
|
"export29": "Position, taille et style du filigrane, etc.",
|
||||||
"theme11": "Utiliser le thème en mode Clair",
|
"theme11": "Utiliser le thème en mode Clair",
|
||||||
"theme12": "Utiliser le thème en mode sombre",
|
"theme12": "Utiliser le thème en mode sombre",
|
||||||
"theme2": "Sélectionnez les icônes utilisées dans l'interface utilisateur",
|
"theme2": "Sélectionnez les icônes utilisées dans l'interface utilisateur",
|
||||||
|
|
|
||||||
|
|
@ -941,6 +941,9 @@
|
||||||
"export24": "啟用後在導出的 Markdown 文件開頭處添加一些較為通用的元資料資訊",
|
"export24": "啟用後在導出的 Markdown 文件開頭處添加一些較為通用的元資料資訊",
|
||||||
"export25": "導出 Word .docx 模板路徑",
|
"export25": "導出 Word .docx 模板路徑",
|
||||||
"export26": "導出 Word .docx 文件時使用的模板絕對路徑,即 Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank \">--reference-doc</a> 參數的值",
|
"export26": "導出 Word .docx 文件時使用的模板絕對路徑,即 Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank \">--reference-doc</a> 參數的值",
|
||||||
|
"export27": "導出 PDF 浮水印",
|
||||||
|
"export28": "浮水印文字或浮水印檔案路徑",
|
||||||
|
"export29": "浮水印位置、大小和樣式等",
|
||||||
"theme11": "淺色模式下使用主題",
|
"theme11": "淺色模式下使用主題",
|
||||||
"theme12": "深色模式下使用主題",
|
"theme12": "深色模式下使用主題",
|
||||||
"theme2": "選擇外觀使用的圖示",
|
"theme2": "選擇外觀使用的圖示",
|
||||||
|
|
|
||||||
|
|
@ -941,6 +941,9 @@
|
||||||
"export24": "启用后在导出的 Markdown 文件开头处添加一些较为通用的元数据信息",
|
"export24": "启用后在导出的 Markdown 文件开头处添加一些较为通用的元数据信息",
|
||||||
"export25": "导出 Word .docx 模板路径",
|
"export25": "导出 Word .docx 模板路径",
|
||||||
"export26": "导出 Word .docx 文件时使用的模板绝对路径,即 Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank\">--reference-doc</a> 参数的值",
|
"export26": "导出 Word .docx 文件时使用的模板绝对路径,即 Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank\">--reference-doc</a> 参数的值",
|
||||||
|
"export27": "导出 PDF 水印",
|
||||||
|
"export28": "水印文本或水印文件路径",
|
||||||
|
"export29": "水印位置、大小和样式等",
|
||||||
"theme11": "明亮模式下使用主题",
|
"theme11": "明亮模式下使用主题",
|
||||||
"theme12": "暗黑模式下使用主题",
|
"theme12": "暗黑模式下使用主题",
|
||||||
"theme2": "选择外观使用的图标",
|
"theme2": "选择外观使用的图标",
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,17 @@ export const exportConfig = {
|
||||||
</div>
|
</div>
|
||||||
<input class="b3-text-field fn__flex-center fn__size200" id="pdfFooter">
|
<input class="b3-text-field fn__flex-center fn__size200" id="pdfFooter">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="fn__flex b3-label config__item">
|
||||||
|
<div class="fn__flex-1">
|
||||||
|
${window.siyuan.languages.export27}
|
||||||
|
<div class="b3-label__text">${window.siyuan.languages.export28}</div>
|
||||||
|
</div>
|
||||||
|
<input class="b3-text-field fn__flex-center fn__size200" id="pdfWatermarkStr">
|
||||||
|
<div class="fn__flex-1">
|
||||||
|
<div class="b3-label__text">${window.siyuan.languages.export29}</div>
|
||||||
|
</div>
|
||||||
|
<input class="b3-text-field fn__flex-center fn__size200" id="pdfWatermarkDesc">
|
||||||
|
</div>
|
||||||
<div class="fn__flex b3-label config__item">
|
<div class="fn__flex b3-label config__item">
|
||||||
<div class="fn__flex-1">
|
<div class="fn__flex-1">
|
||||||
${window.siyuan.languages.export25}
|
${window.siyuan.languages.export25}
|
||||||
|
|
@ -139,6 +150,8 @@ export const exportConfig = {
|
||||||
bindEvent: () => {
|
bindEvent: () => {
|
||||||
(exportConfig.element.querySelector("#docxTemplate") as HTMLInputElement).value = window.siyuan.config.export.docxTemplate;
|
(exportConfig.element.querySelector("#docxTemplate") as HTMLInputElement).value = window.siyuan.config.export.docxTemplate;
|
||||||
(exportConfig.element.querySelector("#pdfFooter") as HTMLInputElement).value = window.siyuan.config.export.pdfFooter;
|
(exportConfig.element.querySelector("#pdfFooter") as HTMLInputElement).value = window.siyuan.config.export.pdfFooter;
|
||||||
|
(exportConfig.element.querySelector("#pdfWatermarkStr") as HTMLInputElement).value = window.siyuan.config.export.pdfWatermarkStr;
|
||||||
|
(exportConfig.element.querySelector("#pdfWatermarkDesc") as HTMLInputElement).value = window.siyuan.config.export.pdfWatermarkDesc;
|
||||||
(exportConfig.element.querySelector("#blockRefTextLeft") as HTMLInputElement).value = window.siyuan.config.export.blockRefTextLeft;
|
(exportConfig.element.querySelector("#blockRefTextLeft") as HTMLInputElement).value = window.siyuan.config.export.blockRefTextLeft;
|
||||||
(exportConfig.element.querySelector("#blockRefTextRight") as HTMLInputElement).value = window.siyuan.config.export.blockRefTextRight;
|
(exportConfig.element.querySelector("#blockRefTextRight") as HTMLInputElement).value = window.siyuan.config.export.blockRefTextRight;
|
||||||
(exportConfig.element.querySelector("#tagOpenMarker") as HTMLInputElement).value = window.siyuan.config.export.tagOpenMarker;
|
(exportConfig.element.querySelector("#tagOpenMarker") as HTMLInputElement).value = window.siyuan.config.export.tagOpenMarker;
|
||||||
|
|
@ -153,6 +166,8 @@ export const exportConfig = {
|
||||||
blockEmbedMode: parseInt((exportConfig.element.querySelector("#blockEmbedMode") as HTMLSelectElement).value, 10),
|
blockEmbedMode: parseInt((exportConfig.element.querySelector("#blockEmbedMode") as HTMLSelectElement).value, 10),
|
||||||
fileAnnotationRefMode: parseInt((exportConfig.element.querySelector("#fileAnnotationRefMode") as HTMLSelectElement).value, 10),
|
fileAnnotationRefMode: parseInt((exportConfig.element.querySelector("#fileAnnotationRefMode") as HTMLSelectElement).value, 10),
|
||||||
pdfFooter: (exportConfig.element.querySelector("#pdfFooter") as HTMLInputElement).value,
|
pdfFooter: (exportConfig.element.querySelector("#pdfFooter") as HTMLInputElement).value,
|
||||||
|
pdfWatermarkStr: (exportConfig.element.querySelector("#pdfWatermarkStr") as HTMLInputElement).value,
|
||||||
|
pdfWatermarkDesc: (exportConfig.element.querySelector("#pdfWatermarkDesc") as HTMLInputElement).value,
|
||||||
docxTemplate: (exportConfig.element.querySelector("#docxTemplate") as HTMLInputElement).value,
|
docxTemplate: (exportConfig.element.querySelector("#docxTemplate") as HTMLInputElement).value,
|
||||||
blockRefTextLeft: (exportConfig.element.querySelector("#blockRefTextLeft") as HTMLInputElement).value,
|
blockRefTextLeft: (exportConfig.element.querySelector("#blockRefTextLeft") as HTMLInputElement).value,
|
||||||
blockRefTextRight: (exportConfig.element.querySelector("#blockRefTextRight") as HTMLInputElement).value,
|
blockRefTextRight: (exportConfig.element.querySelector("#blockRefTextRight") as HTMLInputElement).value,
|
||||||
|
|
|
||||||
2
app/src/types/index.d.ts
vendored
2
app/src/types/index.d.ts
vendored
|
|
@ -594,6 +594,8 @@ interface IExport {
|
||||||
addTitle: boolean;
|
addTitle: boolean;
|
||||||
markdownYFM: boolean;
|
markdownYFM: boolean;
|
||||||
pdfFooter: string;
|
pdfFooter: string;
|
||||||
|
pdfWatermarkStr: string;
|
||||||
|
pdfWatermarkDesc: string;
|
||||||
docxTemplate: string;
|
docxTemplate: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ type Export struct {
|
||||||
MarkdownYFM bool `json:"markdownYFM"` // Markdown 导出时是否添加 YAML Front Matter https://github.com/siyuan-note/siyuan/issues/7727
|
MarkdownYFM bool `json:"markdownYFM"` // Markdown 导出时是否添加 YAML Front Matter https://github.com/siyuan-note/siyuan/issues/7727
|
||||||
PDFFooter string `json:"pdfFooter"` // PDF 导出时页脚内容
|
PDFFooter string `json:"pdfFooter"` // PDF 导出时页脚内容
|
||||||
DocxTemplate string `json:"docxTemplate"` // Docx 导出时模板文件路径
|
DocxTemplate string `json:"docxTemplate"` // Docx 导出时模板文件路径
|
||||||
|
PDFWatermarkStr string `json:"pdfWatermarkStr"` // PDF 导出时水印文本或水印文件路径
|
||||||
|
PDFWatermarkDesc string `json:"pdfWatermarkDesc"` // PDF 导出时水印位置、大小和样式等
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewExport() *Export {
|
func NewExport() *Export {
|
||||||
|
|
|
||||||
|
|
@ -818,7 +818,7 @@ func ProcessPDF(id, p string, merge, removeAssets bool) (err error) {
|
||||||
|
|
||||||
processPDFBookmarks(pdfCtx, headings)
|
processPDFBookmarks(pdfCtx, headings)
|
||||||
processPDFLinkEmbedAssets(pdfCtx, assetDests, removeAssets)
|
processPDFLinkEmbedAssets(pdfCtx, assetDests, removeAssets)
|
||||||
// processPDFWatermark(pdfCtx, "text", "Test", "")
|
processPDFWatermark(pdfCtx)
|
||||||
|
|
||||||
pdfcpu.VersionStr = "SiYuan v" + util.Ver
|
pdfcpu.VersionStr = "SiYuan v" + util.Ver
|
||||||
if writeErr := api.WriteContextFile(pdfCtx, p); nil != writeErr {
|
if writeErr := api.WriteContextFile(pdfCtx, p); nil != writeErr {
|
||||||
|
|
@ -828,32 +828,45 @@ func ProcessPDF(id, p string, merge, removeAssets bool) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func processPDFWatermark(pdfCtx *pdfcpu.Context, mode, watermark, desc string) {
|
func processPDFWatermark(pdfCtx *pdfcpu.Context) {
|
||||||
// Support adding the watermark on export PDF https://github.com/siyuan-note/siyuan/issues/9961
|
// Support adding the watermark on export PDF https://github.com/siyuan-note/siyuan/issues/9961
|
||||||
// https://pdfcpu.io/core/watermark
|
// https://pdfcpu.io/core/watermark
|
||||||
|
|
||||||
|
str := Conf.Export.PDFWatermarkStr
|
||||||
|
if "" == str {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if !IsPaidUser() {
|
if !IsPaidUser() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if "" == watermark {
|
desc := Conf.Export.PDFWatermarkDesc
|
||||||
return
|
f, e := pdfCtx.ExtractFont(1)
|
||||||
|
if nil == e {
|
||||||
|
desc = "fontname:" + f.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
if "text" != mode && "image" != mode && "pdf" != mode {
|
mode := "text"
|
||||||
logging.LogErrorf("invalid watermark type: %s", mode)
|
if gulu.File.IsExist(str) {
|
||||||
return
|
if ".pdf" == strings.ToLower(filepath.Ext(str)) {
|
||||||
|
mode = "pdf"
|
||||||
|
} else {
|
||||||
|
mode = "image"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logging.LogInfof("add PDF watermark [mode=%s, str=%s, desc=%s]", mode, str, desc)
|
||||||
|
|
||||||
var wm *pdfcpu.Watermark
|
var wm *pdfcpu.Watermark
|
||||||
var err error
|
var err error
|
||||||
switch mode {
|
switch mode {
|
||||||
case "text":
|
case "text":
|
||||||
wm, err = pdfcpu.ParseTextWatermarkDetails(watermark, desc, false, pdfcpu.POINTS)
|
wm, err = pdfcpu.ParseTextWatermarkDetails(str, desc, false, pdfcpu.POINTS)
|
||||||
case "image":
|
case "image":
|
||||||
wm, err = pdfcpu.ParseImageWatermarkDetails(watermark, desc, false, pdfcpu.POINTS)
|
wm, err = pdfcpu.ParseImageWatermarkDetails(str, desc, false, pdfcpu.POINTS)
|
||||||
case "pdf":
|
case "pdf":
|
||||||
wm, err = pdfcpu.ParsePDFWatermarkDetails(watermark, desc, false, pdfcpu.POINTS)
|
wm, err = pdfcpu.ParsePDFWatermarkDetails(str, desc, false, pdfcpu.POINTS)
|
||||||
}
|
}
|
||||||
|
|
||||||
if nil != err {
|
if nil != err {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue