✨ 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",
|
||||
"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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "選擇外觀使用的圖示",
|
||||
|
|
|
@ -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": "选择外观使用的图标",
|
||||
|
|
|
@ -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,
|
||||
|
|
2
app/src/types/index.d.ts
vendored
2
app/src/types/index.d.ts
vendored
|
@ -594,6 +594,8 @@ interface IExport {
|
|||
addTitle: boolean;
|
||||
markdownYFM: boolean;
|
||||
pdfFooter: string;
|
||||
pdfWatermarkStr: string;
|
||||
pdfWatermarkDesc: 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
|
||||
PDFFooter string `json:"pdfFooter"` // PDF 导出时页脚内容
|
||||
DocxTemplate string `json:"docxTemplate"` // Docx 导出时模板文件路径
|
||||
PDFWatermarkStr string `json:"pdfWatermarkStr"` // PDF 导出时水印文本或水印文件路径
|
||||
PDFWatermarkDesc string `json:"pdfWatermarkDesc"` // PDF 导出时水印位置、大小和样式等
|
||||
}
|
||||
|
||||
func NewExport() *Export {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue