Support adding the watermark on export PDF https://github.com/siyuan-note/siyuan/issues/9961

This commit is contained in:
Daniel 2023-12-27 09:38:05 +08:00
parent 4fdaae2892
commit 94cc8b2e3b
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
9 changed files with 57 additions and 10 deletions

View file

@ -941,6 +941,9 @@
"export24": "After enabling, add some general metadata information at the beginning of the exported Markdown file",
"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",
"export27": "Export PDF watermark",
"export28": "Watermark text or watermark file path",
"export29": "Watermark position, size and style, etc.",
"theme11": "Use theme in light mode",
"theme12": "Use theme in dark mode",
"theme2": "Select the icons used in the user interface",

View file

@ -941,6 +941,9 @@
"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",
"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",
"theme12": "Usar tema en modo oscuro",
"theme2": "Selecciona los iconos utilizados en la interfaz de usuario",

View file

@ -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é",
"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",
"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",
"theme12": "Utiliser le thème en mode sombre",
"theme2": "Sélectionnez les icônes utilisées dans l'interface utilisateur",

View file

@ -941,6 +941,9 @@
"export24": "啟用後在導出的 Markdown 文件開頭處添加一些較為通用的元資料資訊",
"export25": "導出 Word .docx 模板路徑",
"export26": "導出 Word .docx 文件時使用的模板絕對路徑,即 Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank \">--reference-doc</a> 參數的值",
"export27": "導出 PDF 浮水印",
"export28": "浮水印文字或浮水印檔案路徑",
"export29": "浮水印位置、大小和樣式等",
"theme11": "淺色模式下使用主題",
"theme12": "深色模式下使用主題",
"theme2": "選擇外觀使用的圖示",

View file

@ -941,6 +941,9 @@
"export24": "启用后在导出的 Markdown 文件开头处添加一些较为通用的元数据信息",
"export25": "导出 Word .docx 模板路径",
"export26": "导出 Word .docx 文件时使用的模板绝对路径,即 Pandoc <a href=\"https://pandoc.org/MANUAL.html#option--reference-doc\" target=\"_blank\">--reference-doc</a> 参数的值",
"export27": "导出 PDF 水印",
"export28": "水印文本或水印文件路径",
"export29": "水印位置、大小和样式等",
"theme11": "明亮模式下使用主题",
"theme12": "暗黑模式下使用主题",
"theme2": "选择外观使用的图标",

View file

@ -77,6 +77,17 @@ export const exportConfig = {
</div>
<input class="b3-text-field fn__flex-center fn__size200" id="pdfFooter">
</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-1">
${window.siyuan.languages.export25}
@ -139,6 +150,8 @@ export const exportConfig = {
bindEvent: () => {
(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("#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("#blockRefTextRight") as HTMLInputElement).value = window.siyuan.config.export.blockRefTextRight;
(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),
fileAnnotationRefMode: parseInt((exportConfig.element.querySelector("#fileAnnotationRefMode") as HTMLSelectElement).value, 10),
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,
blockRefTextLeft: (exportConfig.element.querySelector("#blockRefTextLeft") as HTMLInputElement).value,
blockRefTextRight: (exportConfig.element.querySelector("#blockRefTextRight") as HTMLInputElement).value,

View file

@ -594,6 +594,8 @@ interface IExport {
addTitle: boolean;
markdownYFM: boolean;
pdfFooter: string;
pdfWatermarkStr: string;
pdfWatermarkDesc: string;
docxTemplate: string;
}

View file

@ -30,6 +30,8 @@ type Export struct {
MarkdownYFM bool `json:"markdownYFM"` // Markdown 导出时是否添加 YAML Front Matter https://github.com/siyuan-note/siyuan/issues/7727
PDFFooter string `json:"pdfFooter"` // PDF 导出时页脚内容
DocxTemplate string `json:"docxTemplate"` // Docx 导出时模板文件路径
PDFWatermarkStr string `json:"pdfWatermarkStr"` // PDF 导出时水印文本或水印文件路径
PDFWatermarkDesc string `json:"pdfWatermarkDesc"` // PDF 导出时水印位置、大小和样式等
}
func NewExport() *Export {

View file

@ -818,7 +818,7 @@ func ProcessPDF(id, p string, merge, removeAssets bool) (err error) {
processPDFBookmarks(pdfCtx, headings)
processPDFLinkEmbedAssets(pdfCtx, assetDests, removeAssets)
// processPDFWatermark(pdfCtx, "text", "Test", "")
processPDFWatermark(pdfCtx)
pdfcpu.VersionStr = "SiYuan v" + util.Ver
if writeErr := api.WriteContextFile(pdfCtx, p); nil != writeErr {
@ -828,32 +828,45 @@ func ProcessPDF(id, p string, merge, removeAssets bool) (err error) {
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
// https://pdfcpu.io/core/watermark
str := Conf.Export.PDFWatermarkStr
if "" == str {
return
}
if !IsPaidUser() {
return
}
if "" == watermark {
return
desc := Conf.Export.PDFWatermarkDesc
f, e := pdfCtx.ExtractFont(1)
if nil == e {
desc = "fontname:" + f.Name
}
if "text" != mode && "image" != mode && "pdf" != mode {
logging.LogErrorf("invalid watermark type: %s", mode)
return
mode := "text"
if gulu.File.IsExist(str) {
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 err error
switch mode {
case "text":
wm, err = pdfcpu.ParseTextWatermarkDetails(watermark, desc, false, pdfcpu.POINTS)
wm, err = pdfcpu.ParseTextWatermarkDetails(str, desc, false, pdfcpu.POINTS)
case "image":
wm, err = pdfcpu.ParseImageWatermarkDetails(watermark, desc, false, pdfcpu.POINTS)
wm, err = pdfcpu.ParseImageWatermarkDetails(str, desc, false, pdfcpu.POINTS)
case "pdf":
wm, err = pdfcpu.ParsePDFWatermarkDetails(watermark, desc, false, pdfcpu.POINTS)
wm, err = pdfcpu.ParsePDFWatermarkDetails(str, desc, false, pdfcpu.POINTS)
}
if nil != err {