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