推荐使用 github.com/unidoc/unipdf/v3/extract 解析 pdf 文本,该库纯 go 实现、mit 协议免费、中文支持好,但不支持扫描型 pdf(需 ocr),加密 pdf 需预先设密码,且要求 go.mod 和 goproxy 正确配置。

用 github.com/unidoc/unipdf/v3/extract 解析 PDF 文本(推荐方案)
直接用标准库无法解析 PDF,必须依赖第三方库。目前最稳定、中文支持较好、且能处理多数真实 PDF(含扫描件 OCR 除外)的是 unidoc/unipdf 的开源免费子集 —— 它的 extract 包专为文本提取设计,不依赖 C 库,纯 Go 实现。
注意:v3 版本已从商业版中剥离出可免费使用的文本提取能力(unipdf v2 及以前需 license,v3 的 extract 模块在 MIT 协议下可用)。安装命令是:
go get github.com/unidoc/unipdf/v3/extract
常见错误现象:import "github.com/unidoc/unipdf/v3/extract" 报错找不到包,通常是因为 GOPROXY 未启用或模块未初始化。确保项目根目录有 go.mod,且运行过 go mod tidy。
- 只提取文字内容,不保留格式、字体、坐标信息;如需布局还原,得用
model.PdfReader+ 手动遍历ContentStream,复杂度陡增 - 对加密 PDF 默认会失败,需先调用
pdf.Reader.SetPassword()提供密码,否则报错pdf: cannot decrypt encrypted pdf - 若 PDF 是扫描图转成的“图片型 PDF”,该库完全无法提取文字 —— 这不是 bug,是原理限制,此时必须走 OCR 路线(如 tesseract + golang 绑定)
简单代码示例:打开文件 → 提取全部页面文本
以下是最小可行代码,不处理错误细节但覆盖主干逻辑:
package main
import (
"fmt"
"os"
"github.com/unidoc/unipdf/v3/extract"
)
func main() {
f, err := os.Open("example.pdf")
if err != nil {
panic(err)
}
defer f.Close()
pdfExtractor, err := extract.NewPDFExtractor(f)
if err != nil {
panic(err)
}
text, err := pdfExtractor.ExtractText()
if err != nil {
panic(err)
}
fmt.Print(text)
}
关键点说明:
-
ExtractText()返回整个 PDF 所有页面拼接后的字符串,换页处仅用\n\n分隔,无页码标记 - 若只想提取某几页,用
pdfExtractor.ExtractTextFromPages([]int{0, 2})(页码从 0 开始) - 提取结果里可能包含多余空格或换行符,尤其表格区域;建议后续用
strings.TrimSpace和正则清理,例如regexp.MustCompile(<code>\s+).ReplaceAllString(" ", text)
遇到 “invalid PDF structure” 或乱码怎么办?
这类错误多出现在非标准生成的 PDF(如网页转 PDF 工具导出、老旧打印机驱动生成),本质是 PDF 结构损坏或字符映射缺失。unipdf/v3 在解析时会尝试容错,但仍有边界。
可尝试的实操路径:
- 先用
pdfcpu validate example.pdf(需安装pdfcpuCLI)检查 PDF 是否合规;若报错,说明文件本身有问题,优先重生成 PDF - 中文乱码常见于字体未嵌入或 CID 字体映射缺失;unipdf/v3 默认使用内置字典,但部分 PDF 使用私有编码。此时可临时启用宽松模式:
extract.SetDebugMode(true)查看日志中是否提示unknown font - 若确定是字体问题且无法重生成 PDF,可改用
github.com/pdfcpu/pdfcpu/pkg/api提取原始内容流再手动解码 —— 但这需要理解 PDF 对象结构,调试成本高,一般不建议
别踩坑:为什么不要用 gofpdf 或 pdfcpu 直接提文本?
gofpdf 是生成库,没有解析能力;pdfcpu 虽然能读取 PDF 结构,但它的 api.ExtractText 实际调用的是底层 content.Parser,对非标准 PDF 兼容性弱于 unipdf/v3,且默认不处理字体编码映射,中文易变方块或空字符串。
实测对比:
- 同一份含中文宋体的 PDF,
unipdf/v3/extract输出正常中文,pdfcpu api.ExtractText返回空或乱码 -
pdfcpu更适合元数据提取、水印检测、权限分析等结构操作,而非文本还原 - 网上搜到的 “用
github.com/jung-kurt/gofpdf读 PDF” 都是误解,该库只有Write没有Read
真正需要 OCR 的场景(比如发票扫描件、书籍影印 PDF),就别硬套文本提取库 —— 直接上 tesseract CLI + exec.Command 调用,或者用封装好的 github.com/otiai10/gosseract,但得装系统级依赖。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











