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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值