go学习--获取pdf的文字信息和图片信息

1、pdf介绍

pdf分为扫描版和文字版 扫描版:图片转化而成 文字版:pdf中含有文字

2、代码

package main

import (
	"bytes"
	"fmt"
	"github.com/unidoc/unipdf/v3/extractor"
	pdf "github.com/unidoc/unipdf/v3/model"
	"image/jpeg"
	"os"
)

func main(){
          
   
	inputPath := "/Users/**/Desktop/kk.pdf"
	//测试获取文字
	text,err := GetPdfTextContent(inputPath,1)
	if err != nil{
          
   
		return
	}
	fmt.Println(text)

	//测试获取图片
	imageContent,err := GetPdfImageContent(inputPath,1)
	if err != nil{
          
   
		return
	}
	if len(imageContent) > 0{
          
   
		testWriteFile(imageContent[0])
	}
}

// GetPdfTextContent 获取pdf文字内容,起始页pageNum = 1
func GetPdfTextContent(inputPath string,pageNum int)(string,error){
          
   
	// 打开pdf文件
	pdfFile, err := os.Open(inputPath)
	if err != nil {
          
   
		return "",err
	}
	defer pdfFile.Close()
	//获取某一页的信息
	pdfReader, err := pdf.NewPdfReader(pdfFile)
	if err != nil {
          
   
		return "",err
	}
	page, err := pdfReader.GetPage(pageNum)
	//导出文本
	extract, err := extractor.New(page)
	if err != nil {
          
   
		return "",err
	}
	text,err := extract.ExtractText()
	if err != nil{
          
   
		return "",err
	}

	return text,nil
}
// GetPdfImageContent 获取pdf文件图片
func GetPdfImageContent(inputPath string,pageNum int)([][]byte,error){
          
   
	// 打开pdf文件
	pdfFile, err := os.Open(inputPath)
	if err != nil {
          
   
		return nil,err
	}
	defer pdfFile.Close()
	//获取某一页的信息
	pdfReader, err := pdf.NewPdfReader(pdfFile)
	if err != nil {
          
   
		return nil,err
	}
	page, err := pdfReader.GetPage(pageNum)
	extract, err := extractor.New(page)
	if err != nil {
          
   
		return nil,err
	}
	//获取unipdf图片内容
	args := &extractor.ImageExtractOptions{
          
   
		IncludeInlineStencilMasks:false,
	}
	images,err := extract.ExtractPageImages(args)
	if err != nil {
          
   
		return nil, err
	}

	//转化为go 图片处理并获取图片byte
	var ImageBytes [][]byte
	for _,img := range images.Images{
          
   
		//处理单个图片
		oneImage,err := GetOnePdfImageContent(img)
		if err != nil{
          
   
			return nil,err
		}
		ImageBytes = append(ImageBytes, oneImage)
	}
	return ImageBytes,nil
}

// GetOnePdfImageContent 处理单个pdf图片
func GetOnePdfImageContent(imageBuff extractor.ImageMark)([]byte,error){
          
   
	//转换为go image
	goImage,err := imageBuff.Image.ToGoImage()
	if err != nil{
          
   
		return nil,err
	}
	//图片编码
	buf := new(bytes.Buffer)
	opt := jpeg.Options{
          
   Quality: 100}
	err = jpeg.Encode(buf, goImage, &opt)
	if err != nil {
          
   
		return nil,err
	}
	return buf.Bytes(),nil
}

func testWriteFile(data []byte){
          
   
	//写入文件
	fileWrite, err := os.OpenFile("/Users/liuqiuhong/Desktop/kpkp/liu.jpg", os.O_RDWR|os.O_CREATE, 0666)
	if err != nil {
          
   
		return
	}
	fileWrite.Write(data)
}

3、注解

(1)unipdf中ExtractText()获取pdf中文本信息,ExtractPageText()获取每一个字的信息(文字,位置,偏转角度) (2)unipdf获取的图片二进制不是图片本身的二进制,需要将其转化为go二进制,再将go二进制转化为图片自己的二进制

//转换为go image
	goImage,err := imageBuff.Image.ToGoImage()
	if err != nil{
          
   
		return nil,err
	}
	//图片编码
	buf := new(bytes.Buffer)
	opt := jpeg.Options{
          
   Quality: 100}
	err = jpeg.Encode(buf, goImage, &opt)
	if err != nil {
          
   
		return nil,err
	}
	return buf.Bytes(),nil
经验分享 程序员 微信小程序 职场和发展