golang 实现 pdf 转高清晰度 jpeg
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 代码使用
核心要点:
- pdf 需要去除 alpha 通道,然后背景色设置白色(你可以可以根据需求设置其它颜色)
- 留意内存泄露,因为这是 cgo,一旦泄露就 gg 了。比如你没有
mw.RemoveImage()
- 上述的 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相关推荐
- 如何将PDF转换成JPEG图片?
▌01 将PDF转换成JPEG 1.为什么转换? 有的时候需要将PDF文件转换成对应的JPEG文件嵌入在某些文档中,比如对应的PowerPoint,CSDN网页中.这方面的需求如同 使用 python ...
- 【编程实践】Golang 生成PDF
Golang 生成PDF 一个简单但是非常实用的pdf生成器! 安装: go get github.com/jung-kurt/gofpdf 代码: package mainimport (" ...
- 使用golang进行PDF处理,go-tika。就是这个是个warp的封装的版本。ledongthuc/pdf 的开源项目,速度快,解析中文也非常好。可以解析出简历PDF内容
目录 前言 1,关于go-tika 2,使用 3,总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/111028683 ...
- 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片
项目中运用到pdf文件转换成image图片,开始时使用pdfbox开源库进行图片转换,但是转换出来的文件中含有部分乱码的情况.下面是pdfBox 的pdf转换图片的代码示例. try{ String ...
- 用golang处理pdf: 截取pdf和合并pdf
使用一个gopdf 即可实现 牢记真诚善良忍让 package main/* 1.开启1.11mod模式 2.在项目中初始化下mod 比如项目文件夹是go 执行 go mod init go 实际名字 ...
- 如何在电脑/手机上将JPEG图片保存为PDF?
文章来源:https://www.reneelab.com.cn/convert-jpeg-to-pdf.html 目录 一.JPEG与PDF 二.如何在计算机上将JPEG图片转PDF 1.使用都叫兽 ...
- jpeg如何转换成pdf格式
jpeg如何转换成pdf格式 JPEG图像和PDF文档格式是目前在互联网中应用非常广泛.JPEG图像格式具有占用存储器空间小,非常适宜保存和传输的优点.但是JPEG的缺点是不便于阅读浏览,一旦图像增多 ...
- jpeg如何转换成pdf
JPEG图像和PDF文档格式是目前在互联网中应用非常广泛.JPEG图像格式具有占用存储器空间小,非常适宜保存和传输的优点.但是JPEG的缺点是不便于阅读浏览,一旦图像增多,翻阅起来十分麻烦,而PDF文 ...
- 如何将PDF转换为JPEG格式的图片?
有时候,我们需要将PDF文件中的某些内容转换为JPEG格式的图片,以便于在各种设备上浏览和共享.在这种情况下,我们可以使用一些工具将PDF文件转换为JPEG格式的图片.本文将介绍一些常用的工具和方法, ...
最新文章
- 比 ELK 更简洁、高效!企业级日志平台后起之秀 Graylog!
- GROMACS运行参数整理(二)
- linux进入probe目录,Linux基础学习系列——Linux文件目录操作命令
- #include 和 #include 的区别
- 微信公众平台消息接口API指南
- Netty学习笔记(二)Netty服务端流程启动分析
- 我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了
- [JavaWeb-MySQL]MySQL登陆和退出
- unity3d 动态合批设置_Unity3D SkinnedMeshRenderer合批优化
- Kali Linux 从入门到精通(三)-入侵系统定制
- python max函数时间复杂度_程序员的思考:用函数还是用复杂表达式
- android java反编译
- Java并发编程基础(一篇入门)
- Mentor HDL Designer Series 2010.2a Linux 1CD
- 2021-01-18
- python创建按钮command怎么用,python按钮调用函数
- 设计模式学习总结系列应用实例
- strlen、strcpy、strcmp、strcat函数的实现
- c语言中使用的字符常量 其起止标记,C Primer Plus学习笔记(三)- 字符串和格式化输入/输出...
- 一行代码完成英文单词首字母大写转换,ABC、abc、aBC转换为Abc