知识分享之Golang——读取pdf中纯文本内容

简介: 知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。知识分享系列目前包含Java、Golang、Linux、Docker等等。

知识分享之Golang——读取pdf中纯文本内容

背景

知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。

知识分享系列目前包含Java、Golang、Linux、Docker等等。

开发环境

  • 系统:windows10
  • 语言:Golang
  • 组件库:Bleve
  • golang版本:1.17
  • 组件仓库:[ledongthuc/pdf]
  • 开源协议:[BSD 3-Clause "New" or "Revised" License]

内容

日常我们有时需要进行对pdf文件进行读取其中的内容,我对比了各类现有的开源组件库,发现[ledongthuc/pdf]组件比较好用,现分享给大家。

1、安装

go get -u github.com/ledongthuc/pdf
go mod vendor

2、工具类

import (
    "bytes"
    "github.com/ledongthuc/pdf"
)

// ReadPdf 获取pdf文字内容
func ReadPdf(path string) (string, error) {
    f, r, err := pdf.Open(path)
    // remember close file
    defer f.Close()
    if err != nil {
        return "", err
    }
    var buf bytes.Buffer
    b, err := r.GetPlainText()
    if err != nil {
        return "", err
    }
    buf.ReadFrom(b)
    return buf.String(), nil
}

阅读按行分组的文本
func ReadPdfGroup(path string) (string, error) {
    f, r, err := pdf.Open(path)
    defer func() {
        _ = f.Close()
    }()
    if err != nil {
        return "", err
    }
    totalPage := r.NumPage()

    for pageIndex := 1; pageIndex <= totalPage; pageIndex++ {
        p := r.Page(pageIndex)
        if p.V.IsNull() {
            continue
        }

        rows, _ := p.GetTextByRow()
        for _, row := range rows {
            println(">>>> row: ", row.Position)
            for _, word := range row.Content {
                fmt.Println(word.S)
            }
        }
    }
    return "", nil
}
// PDF格式的所有文本
func readPdfFormatAll(path string) (string, error) {
    f, r, err := pdf.Open(path)
    // remember close file
    defer f.Close()
    if err != nil {
        return "", err
    }
    totalPage := r.NumPage()

    for pageIndex := 1; pageIndex <= totalPage; pageIndex++ {
        p := r.Page(pageIndex)
        if p.V.IsNull() {
            continue
        }
        var lastTextStyle pdf.Text
        texts := p.Content().Text
        for _, text := range texts {
            if isSameSentence(text, lastTextStyle) {
                lastTextStyle.S = lastTextStyle.S + text.S
            } else {
                fmt.Printf("Font: %s, Font-size: %f, x: %f, y: %f, content: %s \n", lastTextStyle.Font, lastTextStyle.FontSize, lastTextStyle.X, lastTextStyle.Y, lastTextStyle.S)
                lastTextStyle = text
            }
        }
    }
    return "", nil
}
本文声明:

5330898-d1c72b6c90e378f3.png
知识共享许可协议
本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

目录
相关文章
|
存储 安全 Go
|
弹性计算 IDE Linux
服务器部署 code-server
记录服务器部署 code-server实际操作中的一些坑,大家避坑!!!
4098 1
服务器部署 code-server
fetch上传文件报错的问题(multipart: NextPart: EOF)
技术栈 后台: gin(golang) 前端: react+antd+dva 问题 前端这边使用fetch发送http请求的时候,后端解析formData报错: multipart: NextPart: EOF 分析问题 原因是上传文件太小了Content-Length数量太小了,尝试将headers里这字段的value变大,发现实际的请求依然是较小值。
|
7月前
|
存储 运维 vr&ar
实时云渲染与云桌面解析(二):从云桌面到实时云渲染:图形计算云化的下一站
实时云渲染技术通过云端渲染、终端显示的模式,解决了延迟和性能问题,支持多端接入和快速部署。相比云桌面,实时云渲染更适用于3D设计、VR等图形密集型场景,具有低延迟、弹性扩展等优势。随着5G和边缘计算发展,实时云渲染正推动图形计算向"云-边-端"协同演进,成为数字化转型的重要技术支撑。
|
Docker 容器
解决:Error response from daemon: manifest for xxx:latest not found: manifest unknown.
解决:Error response from daemon: manifest for xxx:latest not found: manifest unknown.
2473 0
|
SQL 数据库连接 Go
Go语言数据库编程:GORM 的基本使用
GORM 是 Go 语言最流行的 ORM 框架,封装了 database/sql,支持自动迁移、关联关系、事务等功能,开发体验接近高层语言的 ORM。本文介绍了 GORM 的安装与初始化、模型定义、自动迁移、基本 CRUD 操作、条件构造器、钩子函数、事务处理、日志调试等内容,帮助开发者快速掌握其使用方法。
|
11月前
|
Rust Ubuntu Java
官方支持长达12年!Ubuntu 24.04 LTS正式开放升级:Linux 6.8内核
对于开发者而言,Ubuntu 24.04 LTS在性能工程和机密计算方面迈出了重要一步,包含了Python 3.12、Ruby 3.2、PHP 8.3和Go 1.22等最新编程语言版本,重点优化了对.NET、Java和Rust等开发环境的支持。
|
监控 网络安全
网页显示HTTP错误503怎么办?HTTP错误503解决方法
HTTP 503错误表示服务器暂时无法处理请求,通常是由于服务器过载或维护导致。常见解决方法包括:1. 等待一段时间再刷新页面;2. 检查服务器负载;3. 确认服务器是否在维护;4. 检查配置错误;5. 联系服务提供商。通过这些步骤,用户和管理员可以有效排查并解决该问题。
18901 3