golang pdf转png

2023-05-15 12:05:32 pdf png Golang

随着数字化时代的到来,越来越多的文件被转化为了电子文档,其中 pdf 文件是最常用的一种。PDF 文件的阅读体验相比于其他文件格式更加友好,但在一些特定场景中,PDF 文件的转化也是必要的,例如将 PDF 文件转化为 PNG 图片格式。

golang 编程语言中,有多种方式可以实现 PDF 转 PNG 的功能。这些方法通常基于不同的第三方库实现。本文将介绍其中几种比较常用的方法。

方法一:使用 Ghostscript 和 ImageMagick

Ghostscript 是一种跨平台的 PostScript 和 PDF 解释器,可以将 PostScript 或 PDF 文件转换为多种格式的图像文件。ImageMagick 是一种功能强大的图像处理工具,可以处理多种图像格式。通过结合使用 Ghostscript 和 ImageMagick,我们可以实现 PDF 转 PNG 的功能。

首先,我们需要在命令行中执行以下命令来安装 Ghostscript 和 ImageMagick:

sudo apt install ghostscript imagemagick

然后,在 Golang 代码中,我们可以通过 os.Exec 函数在命令行中执行以下命令来进行 PDF 转 PNG:

cmd := exec.Command(
  "bash",
  "-c",
  fmt.Sprintf("gs -sDEVICE=pngalpha -r72 -o - %s | convert - %s.png", pdfFilePath, pngFilePath),
)
err := cmd.Run()

在上述代码中,我们使用 Ghostscript 将 PDF 文件转化为 PNG 流,然后使用 ImageMagick 将 PNG 流转化为 PNG 文件。其中,gs 命令的参数 -sDEVICE=pngalpha 表示输出 PNG 格式的图像,-r72 表示设置分辨率为 72dpi,-o 表示输出到标准输出流。

方法二:使用 GoFPDF 库和 rsvg-convert

GoFPDF 是一个基于 FPDF 和 UFPDF 的模块化 PDF 文档生成库,它可以用于创建和操作 PDF 文件。rsvg-convert 是一个基于 rsvg 库的命令行工具,可以将 SVG 文件转化为多种图像格式。通过结合使用 GoFPDF 和 rsvg-convert,我们可以实现 PDF 转 PNG 的功能。

首先,我们需要在命令行中执行以下命令来安装 rsvg-convert:

sudo apt install librsvg2-bin

然后,在 Golang 代码中,我们可以使用 GoFPDF 读取 PDF 文件,并将其转化为 SVG 文件,代码如下:

pdfReader := gofpdf.New("P", "mm", "A4", "")
pdfReader.SetSourceFile(pdfFile)

var buf bytes.Buffer
for i := 1; i <= pdfReader.GetPageCount(); i++ {
  tpl := pdfReader.ImportPage(i)
  opt := gofpdf.ImageOptions{}
  svg, err := tpl.ToSVG(&opt)
  if err != nil {
    return err
  }
  buf.Write(svg)
}

svgData := buf.Bytes()
svgFile, err := os.Create(svgFilePath)
if err != nil {
  return err
}
defer svgFile.Close()

_, err = svgFile.Write(svgData)
if err != nil {
  return err
}

在上述代码中,我们使用 gofpdf.ImportPage 将 PDF 文件的每一页转化为模板(Template),然后使用 ToSVG 方法将每个模板转化为 SVG 文件,并将多个 SVG 文件合并为一个文件保存在本地。需要注意的是,gofpdf.ToSVG 的参数 opt 是一个 gofpdf.ImageOptions 结构体,它包含了转换后 SVG 图像的一些配置信息。

接下来,我们可以使用 rsvg-convert 命令将 SVG 文件转化为 PNG 文件,代码如下:

cmd := exec.Command(
  "bash",
  "-c",
  fmt.Sprintf("rsvg-convert -f png -o %s %s", pngFilePath, svgFilePath),
)
err := cmd.Run()

在上述代码中,我们使用 rsvg-convert 命令将 SVG 文件转化为 PNG 文件,并保存在本地文件系统中。

方法三:使用 UniDoc 库

UniDoc 是一个针对 PDF 文件和其他文档类型的功能强大的 Golang 库,支持各种 PDF 操作,包括 PDF 转 PNG。UniDoc 使用的是 Ghostscript 进行 PDF 转 PNG 的操作。

使用 UniDoc 的代码如下:

pdfReader, err := unipdf.NewPdfReaderFromFile(pdfFilePath)
if err != nil {
  log.Fatalf("Error: %v", err)
}

numPages, err := pdfReader.GetNumPages()
if err != nil {
  log.Fatalf("Error: %v", err)
}

for i := 1; i <= numPages; i++ {
  page, err := pdfReader.GetPageAsImg(i)
  if err != nil {
    log.Fatalf("Error: %v", err)
  }

  pngFile, err := os.Create(pngFilePath)
  defer pngFile.Close()

  if err := png.Encode(pngFile, page); err != nil {
    log.Fatalf("Error: %v", err)
  }
}

在上述代码中,我们使用 UniDoc 的 GetPageAsImg 方法将 PDF 文件的每一页转化为包含图片数据的 Image 类型,然后使用 Golang 内置的 png 库将 Image 类型转化为 PNG 文件并保存到本地磁盘。

总结

以上三种方法中,对于基于 Ghostscript 和 ImageMagick 的方法和基于 GoFPDF 库和 rsvg-convert 工具的方法,我们需要先在命令行中安装相关的工具,然后在 Golang 代码中使用 os.Exec 函数执行相应的命令。对于基于 UniDoc 库的方法,我们只需要导入 UniDoc 库并使用其中的相关方法即可。

综上所述,除了 Golang 自带的 PNG 库外,以上三种方法都使用了第三方库或命令行工具来实现 PDF 转 PNG 的功能。在选择具体实现方法时,我们可以根据项目需要和自身技术栈的特点进行选择。

以上就是golang pdf转png的详细内容,更多请关注其它相关文章!

相关文章