From dd8dd110431119fbb8b46b97a53abd9fc89f87fd Mon Sep 17 00:00:00 2001 From: truthhun <1272881215@qq.com> Date: Fri, 17 Nov 2023 11:37:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81webp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/config.go | 2 +- util/converter/converter.go | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/model/config.go b/model/config.go index 7c8e70e..a22970e 100644 --- a/model/config.go +++ b/model/config.go @@ -704,7 +704,7 @@ func (m *DBModel) initConfig() (err error) { // 转换配置项 {Category: ConfigCategoryConverter, Name: ConfigConverterMaxPreview, Label: "最大预览页数", Value: "12", Placeholder: "文档允许的最大预览页数,0表示不限制", InputType: InputTypeNumber, Sort: 0, Options: ""}, {Category: ConfigCategoryConverter, Name: ConfigConverterTimeout, Label: "转换超时(分钟)", Value: "30", Placeholder: "文档转换超时时间,默认为30分钟", InputType: InputTypeNumber, Sort: 10, Options: ""}, - {Category: ConfigCategoryConverter, Name: ConfigConverterExtension, Label: "预览格式", Value: "svg", Placeholder: "将文档转为特定格式以供预览", InputType: InputTypeSelect, Sort: 20, Options: "svg:SVG\njpg:JPEG\npng:PNG"}, + {Category: ConfigCategoryConverter, Name: ConfigConverterExtension, Label: "预览格式", Value: "svg", Placeholder: "将文档转为特定格式以供预览", InputType: InputTypeSelect, Sort: 20, Options: "svg:SVG\njpg:JPEG\npng:PNG\nwebp:WEBP"}, {Category: ConfigCategoryConverter, Name: ConfigConverterEnableGZIP, Label: "是否启用GZIP压缩", Value: "true", Placeholder: "是否对文档SVG预览文件启用GZIP压缩,启用后转换效率会【稍微】下降,但相对直接的SVG文件减少75%的存储空间", InputType: InputTypeSwitch, Sort: 30, Options: ""}, {Category: ConfigCategoryConverter, Name: ConfigConverterEnableSVGO, Label: "是否启用SVGO", Value: "false", Placeholder: "是否对文档SVG预览文件启用SVGO压缩,启用后转换效率会【明显】下降,但相对直接的SVG文件减少50%左右的存储空间", InputType: InputTypeSwitch, Sort: 40, Options: ""}, {Category: ConfigCategoryConverter, Name: ConfigConverterEnableConvertRepeatedDocument, Label: "是否转换重复文档", Value: "false", Placeholder: "对于已转换过的文档,再次被上传时是否再转换一次", InputType: InputTypeSwitch, Sort: 50, Options: ""}, diff --git a/util/converter/converter.go b/util/converter/converter.go index a78d9ff..48a8e98 100644 --- a/util/converter/converter.go +++ b/util/converter/converter.go @@ -176,15 +176,25 @@ type OptionConvertPages struct { // ConvertPDFToPages 将PDF转为预览页 func (c *Converter) ConvertPDFToPages(src string, fromPage, toPage int, option *OptionConvertPages) (pages []Page, err error) { - switch strings.TrimLeft(option.Extension, ".") { + ext := strings.TrimLeft(option.Extension, ".") + switch ext { case "png": return c.ConvertPDFToPNG(src, fromPage, toPage) - case "jpg": + case "jpg", "webp": // 见将pdf转为png,然后png再转为jpg pages, err = c.ConvertPDFToPNG(src, fromPage, toPage) // 通过imagemagick将图片转为jpg + var ( + dst string + errConvert error + ) for idx, page := range pages { - if dst, errConvert := c.ConvertPNGToJPG(page.PagePath); errConvert == nil { + if ext != "webp" { + dst, errConvert = c.ConvertPNGToJPG(page.PagePath) + } else { + dst, errConvert = c.ConvertPNGToWEBP(page.PagePath) + } + if errConvert == nil { os.Remove(page.PagePath) page.PagePath = dst pages[idx] = page @@ -212,6 +222,22 @@ func (c *Converter) ConvertPNGToJPG(src string) (dst string, err error) { return } +// 将png转为webp +func (c *Converter) ConvertPNGToWEBP(src string) (dst string, err error) { + dst = strings.TrimSuffix(src, filepath.Ext(src)) + ".webp" + // 通过imagemagick将图片转为jpg + args := []string{ + src, + dst, + } + c.logger.Debug("convert png to webp", zap.String("cmd", imageMagick), zap.Strings("args", args)) + _, err = command.ExecCommand(imageMagick, args, c.timeout) + if err != nil { + c.logger.Error("convert png to webp", zap.String("cmd", imageMagick), zap.Strings("args", args), zap.Error(err)) + } + return +} + func (c *Converter) ConvertPDFToJPG(src string, fromPage, toPage int) (pages []Page, err error) { return c.convertPDFToPage(src, fromPage, toPage, ".jpg") }