Imagemagick 使用

这篇博客介绍了如何实现在线预览功能,涉及Office文档到PDF,再到JPEG图片的转换流程。使用了gotenberg作为转换工具,通过Docker容器控制office到pdf的转换并发,并通过Go语言的channel限制pdf转jpg的并发数量以避免内存不足。转换过程中,根据PDF页数动态调整并发,确保高效且稳定的工作流程。
摘要由CSDN通过智能技术生成

最近做了个在线预览的需求

步骤  office->pdf->jpg

工具 : office 转 pdf https://github.com/gotenberg/gotenberg

        pdf 转 jpg https://imagemagick.org/

office转pdf直接启动一个docker容器去转换,通过channel控制并发数量,并发数量太多会导致内存不够,转换失败

docker run --rm -p 3000:3000 gotenberg/gotenberg:7

pdf转jpg直接 通过go执行cmd方式转换

 convert -density 100 -quality 100 -background white -alpha remove "./test.pdf" ./test/test.jpg

density 图片密度(数值越大,需要内存越高,图片效果越好)  quality(0-100)图片质量

为了提升图片转换效率,先获取pdf总页数,然后通过go channel 控制并发数量,一页一页转换

func getPdfPages(filePath string) (int, error) {
   if out, err := exec.Command("identify", filePath).Output(); err != nil {
      return 0, err
   } else {
      slice := strings.Split(strings.TrimSpace(string(out)), "\n")
      return len(slice), nil
   }
}
convertPageLimitChan := make(chan struct{}, 15)
defer close(convertPageLimitChan)
var eg errgroup.Group
for i := 0; i < pages; i++ {
   convertPageLimitChan <- struct{}{}
   page := i
   eg.Go(func() error {
      defer func() {
         <-convertPageLimitChan
      }()
      cmd := exec.Command("convert", "-density", "100", "-quality", "100", "-background", "white", "-alpha", "remove", fmt.Sprintf("%s[%d]", filePath, page), fmt.Sprintf("/tmp/%s/%s-%d.jpg", fileName, fileName, page))
      logger.Info(cmd.Args)
      cr := cmd.Run()
      return cr
   })
}
if er := eg.Wait(); er != nil {
   logger.Error("convert err: ", er)
   return
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值