• Golang PDF转图片 拼接长图 压缩PDF及图片 输出JPEG


    PDF转PNG主要是用到Xpdf的库

    根据操作系统选择命令行工具下载- Download the Xpdf command line tools:

    在bin64目录下可以找到PDFTOPNG可执行文件

    运行该命令即可 

    1. [pdftopng file.pdf ouput-image-name]
    2. 例:pdftopng in.pdf out-prefix

     根据该命令开始写脚本


    首先该命令转出来的图片是多图形式的,图片名格式如下:ouput-name-%06d

    因此首先需要获取pdf页码

    go get rsc.io/pdf

    使用该第三方库打开pdf可获取页码数,即为多图数量

    1. s, _ := pdf.Open("in.pdf") // 获取简历页码
    2. s.NumPage()

     然后通过go调用命令行执行xpdf的可执行文件

    1. // 执行pdf转png
    2. cmd := exec.Command("./pdftopng", "in.pdf", name) // ./cmd + pdf + print
    3. cmd.Run()

    然后是读取图片方法,把png文件读取为image.Image对象

    1. func GetImageFromFile(filePath string) (img image.Image, err error) {
    2. f1Src, err := os.Open(filePath)
    3. if err != nil {
    4. return nil, err
    5. }
    6. defer f1Src.Close()
    7. buff := make([]byte, 512) // why 512 bytes ? see http://golang.org/pkg/net/http/#DetectContentType
    8. _, err = f1Src.Read(buff)
    9. if err != nil {
    10. return nil, err
    11. }
    12. filetype := http.DetectContentType(buff)
    13. fmt.Println(filetype)
    14. fSrc, err := os.Open(filePath)
    15. defer fSrc.Close()
    16. img, err = png.Decode(fSrc)
    17. if err != nil {
    18. return nil, err
    19. }
    20. return img, nil
    21. }

    接下来是拼接长图方法,我们希望长图按多图竖向排列

    1. //图片拼接
    2. func MergeImageNew(base image.Image, mask image.Image, paddingX int, paddingY int) (*image.RGBA, error) {
    3. baseSrcBounds := base.Bounds().Max
    4. maskSrcBounds := mask.Bounds().Max
    5. newWidth := baseSrcBounds.X
    6. newHeight := baseSrcBounds.Y
    7. maskWidth := maskSrcBounds.X
    8. maskHeight := maskSrcBounds.Y
    9. des := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight+maskHeight)) // 底板 newHeight+maskHeight 竖向排列
    10. //首先将一个图片信息存入jpg
    11. draw.Draw(des, des.Bounds(), base, base.Bounds().Min, draw.Over)
    12. //将另外一张图片信息存入jpg
    13. draw.Draw(des, image.Rect(paddingX, newHeight-paddingY+maskHeight, (paddingX+maskWidth), (newHeight-paddingY)), mask, image.ZP, draw.Over)
    14. return des, nil
    15. }

    然后是把拼接结果保存为图片的方法

    1. func SaveImage(p string, src image.Image) error {
    2. f, err := os.OpenFile(p, os.O_SYNC|os.O_RDWR|os.O_CREATE, 0666)
    3. if err != nil {
    4. return err
    5. }
    6. defer f.Close()
    7. ext := filepath.Ext(p)
    8. if strings.EqualFold(ext, ".jpg") || strings.EqualFold(ext, ".jpeg") {
    9. err = jpeg.Encode(f, src, &jpeg.Options{Quality: 80})
    10. } else if strings.EqualFold(ext, ".png") {
    11. err = png.Encode(f, src)
    12. } else if strings.EqualFold(ext, ".gif") {
    13. err = gif.Encode(f, src, &gif.Options{NumColors: 256})
    14. }
    15. return err
    16. }

    最后开可以对结果图进行压缩

    1. s, _ := pdf.Open("in.pdf") // 获取简历页码
    2. name := "out-prefix" // 输出简历图片名称
    3. // 执行pdf转png
    4. cmd := exec.Command("./pdftopng", "in.pdf", name) // ./cmd + pdf + print
    5. cmd.Run()
    6. // 拼接长图
    7. imgBase, _ := GetImageFromFile(name + "-" + fmt.Sprintf("%06d", 1) + ".png")
    8. for i := 2; i <= s.NumPage(); i++ {
    9. img, _ := GetImageFromFile(name + "-" + fmt.Sprintf("%06d", i) + ".png")
    10. imgBase, _ = MergeImageNew(imgBase, img, 0, 0)
    11. }
    12. // 压缩长图
    13. baseSrcBounds := imgBase.Bounds().Max
    14. newWidth := baseSrcBounds.X
    15. newHeight := baseSrcBounds.Y
    16. canvas := resize.Resize(uint(newWidth), uint(newHeight), imgBase, resize.Lanczos3)
    17. // 保存长图
    18. SaveImage(name+".jpeg", canvas)

  • 相关阅读:
    如何对Spring MVC中的Controller进行单元测试
    【HMS core】【ML Kit】机器学习服务常见问题FAQ(二)
    基于ASP.net的服装商城设计
    设计模式之单例模式
    Vue79-路由组件独有的2个新的生命周期钩子
    cmake学习笔记 一
    CCRC-DSO学员分享:数据安全官——导师与朋友的双重身份
    vector模拟实现【c++】
    源码剖析Spring依赖注入:今天你还不会,你就输了
    【无标题】
  • 原文地址:https://blog.csdn.net/weixin_44165203/article/details/127672711