ImageMagick 是一个功能丰富的图片处理工具

具体安装方式可以参考官方,MacOS 上可以通过 homebrew 安装

brew install imagemagick@6

homebrew 最新的源是 7.* 版本,由于我的场景需要在 linux 部署,linux 的 apt 源目前是 6.9, 为了保持一致,所以使用的是旧版本

命令行使用

convert -density 128 1.pdf -quality 100 -alpha remove output.jpeg

Golang 代码使用

核心要点:

  1. pdf 需要去除 alpha 通道,然后背景色设置白色(你可以可以根据需求设置其它颜色)
  2. 留意内存泄露,因为这是 cgo,一旦泄露就 gg 了。比如你没有 mw.RemoveImage()
  3. 上述的 density 设置就是 resolution, 需要设置一个合理的值,否则转换的图片就会糊

golang 的 binding 安装方式可以按照 github 介绍 https://github.com/gographics/imagick

package mainimport ("fmt""io/ioutil""runtime""runtime/debug""time""gopkg.in/gographics/imagick.v2/imagick"
)func main() {imagick.Initialize()//defer imagick.Terminate()data, _ := ioutil.ReadFile("1.pdf")start := time.Now()for i := 0; i < 100; i++ {if i%10 == 0 {fmt.Println("i", i)}go createCoverImage(data, "1-1.jpeg")}fmt.Println("duration", time.Now().Sub(start))PrintMemUsage()debug.FreeOSMemory()PrintMemUsage()time.Sleep(10 * time.Second)imagick.Terminate()fmt.Println("free cgo")PrintMemUsage()time.Sleep(10 * time.Minute)
}// PrintMemUsage outputs the current, total and OS memory being used. As well as the number
// of garage collection cycles completed.
func PrintMemUsage() {var m runtime.MemStatsruntime.ReadMemStats(&m)// For info on each, see: https://golang.org/pkg/runtime/#MemStatsfmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))fmt.Printf("\tNumGC = %v\n", m.NumGC)
}func bToMb(b uint64) uint64 {return b / 1024 / 1024
}func clearImagickWand(mw *imagick.MagickWand) {mw.RemoveImage()mw.Clear()mw.Destroy()//runtime.SetFinalizer(mw, nil)mw = nil
}func createCoverImage(data []byte, coverPathName string) bool {//sourceImagePath := getSourceImageForCover(filepath.Dir(pathNoExtension))mw := imagick.NewMagickWand()defer clearImagickWand(mw)mw.SetResolution(192, 192)err := mw.ReadImageBlob(data)if err != nil {return false}//length := mw.GetImageIterations()//fmt.Println("length", length)//fmt.Println("width", mw.GetImageWidth())//fmt.Println("height", mw.GetImageHeight())pix := imagick.NewPixelWand()pix.SetColor("white")//mw.SetBackgroundColor(pix)mw.SetImageAlphaChannel(imagick.ALPHA_CHANNEL_REMOVE)mw.SetImageFormat("jpeg")err = mw.WriteImage(coverPathName)if err != nil {return false}_ = mw.GetImageBlob()return true
}

特别地,需要设置两个环境变量

export CGO_CFLAGS_ALLOW='-Xpreprocessor'
export PKG_CONFIG_PATH="/usr/local/opt/imagemagick@6/lib/pkgconfig" # 取决于 brew install 的输出

golang 实现 pdf 转高清晰度 jpeg相关推荐

  1. 如何将PDF转换成JPEG图片?

    ▌01 将PDF转换成JPEG 1.为什么转换? 有的时候需要将PDF文件转换成对应的JPEG文件嵌入在某些文档中,比如对应的PowerPoint,CSDN网页中.这方面的需求如同 使用 python ...

  2. 【编程实践】Golang 生成PDF

    Golang 生成PDF 一个简单但是非常实用的pdf生成器! 安装: go get github.com/jung-kurt/gofpdf 代码: package mainimport (" ...

  3. 使用golang进行PDF处理,go-tika。就是这个是个warp的封装的版本。ledongthuc/pdf 的开源项目,速度快,解析中文也非常好。可以解析出简历PDF内容

    目录 前言 1,关于go-tika 2,使用 3,总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/111028683 ...

  4. 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片

    项目中运用到pdf文件转换成image图片,开始时使用pdfbox开源库进行图片转换,但是转换出来的文件中含有部分乱码的情况.下面是pdfBox 的pdf转换图片的代码示例. try{ String ...

  5. 用golang处理pdf: 截取pdf和合并pdf

    使用一个gopdf 即可实现 牢记真诚善良忍让 package main/* 1.开启1.11mod模式 2.在项目中初始化下mod 比如项目文件夹是go 执行 go mod init go 实际名字 ...

  6. 如何在电脑/手机上将JPEG图片保存为PDF?

    文章来源:https://www.reneelab.com.cn/convert-jpeg-to-pdf.html 目录 一.JPEG与PDF 二.如何在计算机上将JPEG图片转PDF 1.使用都叫兽 ...

  7. jpeg如何转换成pdf格式

    jpeg如何转换成pdf格式 JPEG图像和PDF文档格式是目前在互联网中应用非常广泛.JPEG图像格式具有占用存储器空间小,非常适宜保存和传输的优点.但是JPEG的缺点是不便于阅读浏览,一旦图像增多 ...

  8. jpeg如何转换成pdf

    JPEG图像和PDF文档格式是目前在互联网中应用非常广泛.JPEG图像格式具有占用存储器空间小,非常适宜保存和传输的优点.但是JPEG的缺点是不便于阅读浏览,一旦图像增多,翻阅起来十分麻烦,而PDF文 ...

  9. 如何将PDF转换为JPEG格式的图片?

    有时候,我们需要将PDF文件中的某些内容转换为JPEG格式的图片,以便于在各种设备上浏览和共享.在这种情况下,我们可以使用一些工具将PDF文件转换为JPEG格式的图片.本文将介绍一些常用的工具和方法, ...

最新文章

  1. 比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
  2. GROMACS运行参数整理(二)
  3. linux进入probe目录,Linux基础学习系列——Linux文件目录操作命令
  4. #include 和 #include 的区别
  5. 微信公众平台消息接口API指南
  6. Netty学习笔记(二)Netty服务端流程启动分析
  7. 我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了
  8. [JavaWeb-MySQL]MySQL登陆和退出
  9. unity3d 动态合批设置_Unity3D SkinnedMeshRenderer合批优化
  10. Kali Linux 从入门到精通(三)-入侵系统定制
  11. python max函数时间复杂度_程序员的思考:用函数还是用复杂表达式
  12. android java反编译
  13. Java并发编程基础(一篇入门)
  14. Mentor HDL Designer Series 2010.2a Linux 1CD
  15. 2021-01-18
  16. python创建按钮command怎么用,python按钮调用函数
  17. 设计模式学习总结系列应用实例
  18. strlen、strcpy、strcmp、strcat函数的实现
  19. c语言中使用的字符常量 其起止标记,C Primer Plus学习笔记(三)- 字符串和格式化输入/输出...
  20. 一行代码完成英文单词首字母大写转换,ABC、abc、aBC转换为Abc

热门文章

  1. Android SlidingMenu 开源项目使用示例(一)
  2. MySQL窗口函数简介
  3. 跳动的心 - HTML 代码
  4. 超低功耗离线智能语音识别芯片AT6811
  5. android源码结构分析
  6. dnf大区服务器位置,dnf河北一区是跨几
  7. Java、JSP物流车辆调度系统
  8. Elasticsearch7.x索引index的备份和恢复,index索引误删恢复
  9. DDD(Domain-Driven Design 领域驱动设计) 与产品设计
  10. 软件设计的概念与原则