PDF转PNG主要是用到Xpdf的库
根据操作系统选择命令行工具下载- Download the Xpdf command line tools:
在bin64目录下可以找到PDFTOPNG可执行文件
运行该命令即可
- [pdftopng file.pdf ouput-image-name]
- 例:pdftopng in.pdf out-prefix
根据该命令开始写脚本
首先该命令转出来的图片是多图形式的,图片名格式如下:ouput-name-%06d
因此首先需要获取pdf页码
go get rsc.io/pdf
使用该第三方库打开pdf可获取页码数,即为多图数量
- s, _ := pdf.Open("in.pdf") // 获取简历页码
- s.NumPage()
然后通过go调用命令行执行xpdf的可执行文件
- // 执行pdf转png
- cmd := exec.Command("./pdftopng", "in.pdf", name) // ./cmd + pdf + print
- cmd.Run()
然后是读取图片方法,把png文件读取为image.Image对象
- func GetImageFromFile(filePath string) (img image.Image, err error) {
- f1Src, err := os.Open(filePath)
-
- if err != nil {
- return nil, err
- }
- defer f1Src.Close()
-
- buff := make([]byte, 512) // why 512 bytes ? see http://golang.org/pkg/net/http/#DetectContentType
- _, err = f1Src.Read(buff)
-
- if err != nil {
- return nil, err
- }
-
- filetype := http.DetectContentType(buff)
-
- fmt.Println(filetype)
-
- fSrc, err := os.Open(filePath)
- defer fSrc.Close()
-
- img, err = png.Decode(fSrc)
- if err != nil {
- return nil, err
- }
- return img, nil
- }
接下来是拼接长图方法,我们希望长图按多图竖向排列
- //图片拼接
- func MergeImageNew(base image.Image, mask image.Image, paddingX int, paddingY int) (*image.RGBA, error) {
- baseSrcBounds := base.Bounds().Max
-
- maskSrcBounds := mask.Bounds().Max
-
- newWidth := baseSrcBounds.X
- newHeight := baseSrcBounds.Y
-
- maskWidth := maskSrcBounds.X
- maskHeight := maskSrcBounds.Y
-
- des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight+maskHeight)) // 底板 newHeight+maskHeight 竖向排列
- //首先将一个图片信息存入jpg
- draw.Draw(des, des.Bounds(), base, base.Bounds().Min, draw.Over)
- //将另外一张图片信息存入jpg
- draw.Draw(des, image.Rect(paddingX, newHeight-paddingY+maskHeight, (paddingX+maskWidth), (newHeight-paddingY)), mask, image.ZP, draw.Over)
-
- return des, nil
- }
然后是把拼接结果保存为图片的方法
- func SaveImage(p string, src image.Image) error {
- f, err := os.OpenFile(p, os.O_SYNC|os.O_RDWR|os.O_CREATE, 0666)
- if err != nil {
- return err
- }
- defer f.Close()
- ext := filepath.Ext(p)
- if strings.EqualFold(ext, ".jpg") || strings.EqualFold(ext, ".jpeg") {
- err = jpeg.Encode(f, src, &jpeg.Options{Quality: 80})
- } else if strings.EqualFold(ext, ".png") {
- err = png.Encode(f, src)
- } else if strings.EqualFold(ext, ".gif") {
- err = gif.Encode(f, src, &gif.Options{NumColors: 256})
- }
- return err
- }
最后开可以对结果图进行压缩
- s, _ := pdf.Open("in.pdf") // 获取简历页码
- name := "out-prefix" // 输出简历图片名称
-
- // 执行pdf转png
- cmd := exec.Command("./pdftopng", "in.pdf", name) // ./cmd + pdf + print
- cmd.Run()
-
- // 拼接长图
- imgBase, _ := GetImageFromFile(name + "-" + fmt.Sprintf("%06d", 1) + ".png")
- for i := 2; i <= s.NumPage(); i++ {
- img, _ := GetImageFromFile(name + "-" + fmt.Sprintf("%06d", i) + ".png")
- imgBase, _ = MergeImageNew(imgBase, img, 0, 0)
- }
-
- // 压缩长图
- baseSrcBounds := imgBase.Bounds().Max
- newWidth := baseSrcBounds.X
- newHeight := baseSrcBounds.Y
- canvas := resize.Resize(uint(newWidth), uint(newHeight), imgBase, resize.Lanczos3)
-
- // 保存长图
- SaveImage(name+".jpeg", canvas)