go语言中pdf转图片功能的实现(CentOS)
代码实现
步骤1:下载imagick
步骤2:go实现代码如下
package main
import (
"os"
"strconv"
"gopkg.in/gographics/imagick.v2/imagick"
)
func main() {
ConvertPdfToImage("test.pdf", 800, 1212, 200, 85)
}
//ConvertPdfToImage 转换pdf为图片格式
//@resolution:扫描精度
//@CompressionQuality:图片质量: 1~100
func ConvertPdfToImage(bookname string, pageWidth uint, pageHeight uint, resolution float64, compressionQuality uint) (err error) {
imagick.Initialize()
defer imagick.Terminate()
mw := imagick.NewMagickWand()
//defer mw.Clear()
defer mw.Destroy()
if err := mw.SetResolution(resolution, resolution); err != nil {
println("扫描精度设置失败")
return err
}
if err := mw.ReadImage(bookname); err != nil {
println("文件读取失败")
return err
}
var pages = int(mw.GetNumberImages())
println("页数:", pages)
//裁剪会使页数增加
addPages := 0
path := ""
for i := 0; i < pages; i++ {
mw.SetIteratorIndex(i) // This being the page offset
//压平图像,去掉alpha通道,防止JPG中的alpha变黑,用在ReadImage之后
if err := mw.SetImageAlphaChannel(imagick.ALPHA_CHANNEL_FLATTEN); err != nil {
println("图片")
return err
}
mw.SetImageFormat("jpg")
mw.SetImageCompression(imagick.COMPRESSION_JPEG)
mw.SetImageCompressionQuality(compressionQuality)
//如果width>height ,就裁剪成两张
pWidth := mw.GetImageWidth()
pHeight := mw.GetImageHeight()
//需要裁剪
if pWidth > pHeight {
//mw.ResizeImage(pageWidth*2, pageHeight, imagick.FILTER_UNDEFINED, 1.0)
mw.ThumbnailImage(pageWidth*2, pageHeight)
tempImage := mw.GetImageFromMagickWand()
leftMw := imagick.NewMagickWandFromImage(tempImage) //由于返回的是指针,需要提前初始化,不然写完左半业tempImage就变了
//左半页
mw.CropImage(pageWidth, pageHeight, 0, 0)
path = "./book/page" + strconv.Itoa(i+addPages) + ".jpg"
mw.WriteImage(path)
//右半页
leftMw.SetImageFormat("jpg")
leftMw.SetImageCompression(imagick.COMPRESSION_JPEG)
leftMw.SetImageCompressionQuality(compressionQuality)
leftMw.CropImage(pageWidth, pageHeight, int(pageWidth), 0)
addPages++
path = "./book/page" + strconv.Itoa(i+addPages) + ".jpg"
leftMw.WriteImage(path)
leftMw.Destroy()
} else {
mw.ThumbnailImage(pageWidth, pageHeight)
path = "./book/page" + strconv.Itoa(i+addPages) + ".jpg"
mw.WriteImage(path)
}
}
println("转换完毕!")
os.Exit(0) //模拟退出程序,删掉!
return nil
}
三、问题解决
在运行过程中报错如下:
问题一:../gopkg.in/gographics/imagick.v2/imagick/drawing_wand.go:39: undefined: runtime.KeepAlive
解决:go版本过低导致
问题二:go build gopkg.in/gographics/imagick.v2/imagick: invalid flag in pkg-config --cflags: -fopenmp
解决:go版本原因。
问题三:/tmp/go-build695941684/command-line-arguments/_obj/exe/pdfconvert: error while loading shared libraries: libMagickWand-6.Q16.so.5: cannot open shared object file: No such file or directory
解决:进入目录/user/local/lib中,运行ldconfig /user/local/lib。即解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构