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