注:本例子适合将小文件纯文本的 pdf 转换为 word 文档
1、首先下载Apache/tika的jar包,下载地址如下:
#tika-server-standard-2.6.0.jar
https://tika.apache.org/
2、启动tika包,执行命令如下:
#继续需要提前安装jdk环境
nohut java -jar tika-server-standard-2.6.0.jar &
#不一定非要通过此方式启动,通过docker也可以,看个人需求
3、查看进程对应端口9998,如图:
4、定义main.go文件,文件内容如下:
package main
import (
"context"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"project/readhtml"
"github.com/google/go-tika/tika"
)
func main() {
filePath := "new.pdf"
//调用函数ReadPdf解析pdf文件
content, err := ReadPdf(filePath) // Read local pdf file
if err != nil {
panic(err)
}
//将pdf的所有内容写入html文件)
err = ioutil.WriteFile("./out.html", []byte(content), 0666)
if err != nil {
log.Fatal(err)
}
//先将html中的<title>标签去掉,因为此标签中含有特殊字符,会导致xml语法出错
delerr := deleteTitle("out.html")
if delerr != nil {
log.Fatal(delerr)
}
err = readhtml.ReadHtml("out.html")
if err != nil {
log.Fatal(err)
}
}
//删除html中的title标签
func deleteTitle(filename string) error {
cmd := exec.Command("bash", "-c", fmt.Sprintf("sed -i '65d' %s", filename))
_, err := cmd.Output()
if err != nil {
return err
}
return nil
}
//解析PDF文件
func ReadPdf(path string) (string, error) {
f, err := os.Open(path)
defer f.Close()
if err != nil {
return "", err
}
client := tika.NewClient(nil, "http://127.0.0.1:9998")
return client.Parse(context.TODO(), f)
}
5、在main.go同级目录下创建文件夹readhtml,在文件夹中定义文件readhtml.go,内容如下:
package readhtml
import (
"encoding/xml"
"io/ioutil"
)
//定义多个结构体,用来接收反序列化数据
type (
html struct {
XMLNAME xml.Name `xml:"html"`
Body htmlBody `xml:"body"`
}
htmlBody struct {
XMLNAME xml.Name `xml:"body"`
Div htmlDiv `xml:"div"`
}
htmlDiv struct {
P []string `xml:"p"`
}
)
//读取html文件,并反序列化到结构体中
func ReadHtml(filename string) error {
rf, err := ioutil.ReadFile(filename)
if err != nil {
return err
}
html := html{}
err = xml.Unmarshal(rf, &html)
if err != nil {
return err
}
var b []byte
for _, v := range html.Body.Div.P {
b = append(b, []byte(v)...)
}
err = ioutil.WriteFile("res.doc", b, 0644)
if err != nil {
return err
}
return nil
}
6、上传new.pdf文件到main.go同级目录下,然后执行main.go,如图:
可看到执行后生成了out.html和res.doc文件,查看res.doc文件内容(截取部分)如下:
源文件new.pdf内容如下:
至此,PDF转word完成!!!