1. 程式人生 > >go語言中pdf轉圖片功能的實現(CentOS)

go語言中pdf轉圖片功能的實現(CentOS)

一、centos下環境部署

步驟1:部署ImageMagick

(2)解壓剛才下載的檔案: tar xvf  ImageMagick-6.9.9-36.tar.gz

(3)進入解壓目錄:cd ImageMagick-6.9.9-36

(4)檢查配置:./configure

(5)安裝jpeg:yum install libjpeg* libpng* freetype* gd*

(6)安裝ImageMagick:make install

輸入convert -resize 100x100 hua.jpg hua1.jpg  如果執行成功,表明安裝成功。我在安裝的時候報錯如下:

{[Error:Command failed:convert:nodecode delegate for this image format `JPEG' @ error/constitute.c/ReadImage/501.
convert: no images defined `/home/node/head/I/IMG_0005.JPG' @ error/convert.c/ConvertImageCommand/3230.

] code: 1, signal: null }

解決辦法:重灌Imagemagick
make uninstall
./configure
make
make install
再次呼叫成功。

(7)環境變數配置: 進入/etc/profile,寫入

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

export MAGICK_CODER_MODULE_PATH=/data/download/ImageMagick-6.9.9-36/coders/

其中MAGICK_CODER_MODULE_PATH指ImageMagick-6.9.9-36安裝目錄下的coders(需要將/usr/local/lib下面的.so複製到該路徑下),PKG_CONFIG_PATH路徑下的內容如圖中所示:


步驟2:部署GhostScript

(1)下載安裝 GhostScript,官網地址:http://ghostscript.com/download/gsdnld.html。我這裡下載的是ghostscript-9.22-linux-x86_64.tgz

(2)解壓剛才下載的檔案: tar xvf  ghostscript-9.22-linux-x86_64.tgz

(3)進入解壓目錄,將gs直接複製到 /usr/bin 目錄下

(4)進入/usr/bin 目錄中,chmod 777 gs

(5)輸入命令 gs -version 如果有如下輸出,說明安裝成功,列印的是版本:


二、程式碼實現

步驟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。即解決。

參考文章:http://blog.csdn.net/gaofuqi/article/details/26698547

                 http://blog.csdn.net/lisaem/article/details/50330953

                http://blog.csdn.net/catoop/article/details/42677021

                http://blog.csdn.net/arackethis/article/details/42241471