前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟带你通过 Go 语言实现 PDF 转 Word !

3分钟带你通过 Go 语言实现 PDF 转 Word !

作者头像
小锟哥哥
发布2023-09-13 20:25:15
4710
发布2023-09-13 20:25:15
举报
文章被收录于专栏:GoLang全栈GoLang全栈

注:本例子适合将小文件纯文本的 pdf 转换为 word 文档

演示环境:

  • centos7
  • Apache/tika (解析pdf)
  • go-tika (golang库)

1、首先下载Apache/tika的jar包,下载地址如下:

代码语言:javascript
复制
#tika-server-standard-2.6.0.jar
https://tika.apache.org/

2、启动tika包,执行命令如下:

代码语言:javascript
复制

#继续需要提前安装jdk环境
nohut java -jar tika-server-standard-2.6.0.jar &
#不一定非要通过此方式启动,通过docker也可以,看个人需求

3、查看进程对应端口9998,如图:

4、定义main.go文件,文件内容如下:

代码语言:javascript
复制
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,内容如下:

代码语言:javascript
复制
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完成!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-23 18:00:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 演示环境:
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档