golang pdf 操作之 govips

大家好,我是皇子

实操 "github.com/davidbyttow/govips/v2/vips" 库将 pdf 转成图片的过程

官方文档:https://github.com/davidbyttow/govips

关于libvips:https://github.com/libvips/libvips

该包通过将所有图像操作公开在 Go 中的第一类类型上,包装了 libvips 图像处理库的核心功能。Libvips 通常比其他图形处理器(如 GraphicsMagick 和 ImageMagick)快 4-8 倍。检查基准测试:速度和内存使用。

这样做的目的是使开发人员能够在 Go 中构建速度极快的图像处理器,这非常适合并发请求。

解决所有问题后打包好的镜像:docker pull leeprince/golang1_19:govips_v2

一、完整 Dockerfile

后来才发现官方有基于ubuntu构建的环境(https://github.com/davidbyttow/govips/tree/master/build),发现原来 libvips 可以直接通过 apt-get install -y libvips-dev,并包含其他依赖,如:imagemagick、libmagickwand,但是同样也遇到一些问题,在下面给出了解决办法

FROM golang:1.19

# Ignore APT warnings about not having a TTY
ENV DEBIAN_FRONTEND noninteractive

# install build essentials
RUN apt-get update && \
apt-get install -y wget build-essential pkg-config --no-install-recommends

# Install ImageMagick deps
RUN apt-get -q -y install libvips-dev libglib2.0-dev libexpat1-dev \
libtiff5-dev libgsf-1-dev \
libjpeg-dev libpng-dev libtiff-dev \
libgif-dev libx11-dev ghostscript --no-install-recommends

ENV LIBVIPS_VERSION=8.15.1
ENV LIBVIPS_DIR_PREFIX=/etc/vips

RUN wget https://github.com/libvips/libvips/archive/refs/tags/v${LIBVIPS_VERSION}.tar.gz

RUN apt-get -q -y install meson

RUN tar -xvzf v${LIBVIPS_VERSION}.tar.gz && \
cd libvips* && \
meson setup build-dir --prefix=${LIBVIPS_DIR_PREFIX} && \
cd build-dir && \
ninja && \
ninja test && \
ninja install

WORKDIR /www

VOLUME ["/www"]

EXPOSE 80

CMD tail -f /dev/null

二、问题

1)libjpeg-turbo8-dev

Package libjpeg-turbo8-dev is not available, but is referred to by another package.

解决:

libjpeg-dev 代替 libjpeg-turbo8-dev

2)meson

安装 libvips 时需要使用 meson, 所以需要提前安装

apt-get install -y meson

3)error: cannot find builtin CJK font

error: cannot find builtin CJK font
warning: unrecoverable error; ignoring rest of page

效果:pdf 文件转图片时,除了签章,中文部分都没有显示在图片上

解决:

apt-get install -y fonts-noto-cjk

fonts-noto-cjk 包含 cjk 语言包,但是安装后不报错了,但是问题并没有解决,只是不报错了!

继续解决:

apt-get install -y fonts-arphic-ukai

fonts-arphic-ukai 与 fonts-noto-cjk 一样的情况

最终解决:

apt-get install -y fonts-arphic-uming

建议:一次性把这些语言包都装上

apt-get -q -y install fonts-arphic-uming fonts-arphic-ukai fonts-noto-cjk  --no-install-recommends

语言包

  • fonts-noto-cjk: Noto 字体系列,包括中文、日文、韩文等各种语言的字体。
  • fonts-arphic-ukai: AR PL UKai 中文字体。
  • fonts-arphic-uming: AR PL UMing 中文字体。

三、测试代码

官方示例,有些方法(2023-12-19)已经废弃,手动替换即可

package main

import (
"fmt"
"os"

"github.com/davidbyttow/govips/v2/vips"
)

func checkError(err error) {
if err != nil {
fmt.Println("error:", err)
os.Exit(1)
}
}

func main() {
vips.Startup(nil)
defer vips.Shutdown()

image1, err := vips.NewImageFromFile("0001.png")
checkError(err)

// Rotate the picture upright and reset EXIF orientation tag
err = image1.AutoRotate()
checkError(err)

// 导出图像
// 替换前
/*ep := vips.NewDefaultJPEGExportParams()
image1bytes, _, err := image1.Export(ep)*/

// 替换后
image1bytes, _, err := image1.ExportNative()
checkError(err)

// 写入本地文件
dirPath := "."
fileName := fmt.Sprintf("resize_%d.jpg", time.Now().Unix())
filePath := filepath.Join(dirPath, fileName)

ok, err := WriteFile(dirPath, filePath, image1bytes, false)
if !ok {
fmt.Println("fileutil.WriteFile !ok")
return
}
checkError(err)
fmt.Println("successful, filepath:", filePath)
}

四、基于镜像构建并运行

  1. cd 通过上面的<测试代码>构建的项目中
  2. 构建镜像。目前已经测试成功,并上传到 docker hub,无需再构建镜像,仅需直接拉取:docker pull leeprince/golang1_19:govips_v2。感兴趣可以重新在本地构建
docker build -t leeprince/golang1_19:govips_v2
  1. 基于镜像构建 govips_v2 的运行环境的容器
docker run -d -v .:/www -p 8083:80 --name govips_v2_1 leeprince/golang1_19:govips_v2
  1. 进入容器
docker exec -it govips_v2_1 bash
  1. 运行代码:运行成功后,则可以将 pdf 转为图片
go run main.go

关注我,一起成长

记得点击转发和在看


请使用浏览器的分享功能分享到微信等