go解析pdf

在 Go 语言中解析 PDF 文件时,很多开发者早期可能会考虑使用 github.com/dslipak/pdf,但该库在处理大文件或复杂 PDF 时存在较为明显的性能问题(如内存占用过高、解析速度慢)。

因此,**建议使用 github.com/ledongthuc/pdf**。它是更为优秀的衍生版本,针对一些性能瓶颈和功能做了优化改进,解析更加稳定和高效。

github.com/ledongthuc/pdf 使用示例

下面是一个使用 github.com/ledongthuc/pdf 读取并提取 PDF 中纯文本的完整示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main

import (
"fmt"
"log"
"os"

"github.com/ledongthuc/pdf"
)

func main() {
// 1. 打开 PDF 文件
f, err := os.Open("example.pdf")
if err != nil {
log.Fatalf("无法打开文件: %v", err)
}
defer f.Close()

// 2. 获取文件信息(创建 Reader 时需要用到文件总大小)
finfo, err := f.Stat()
if err != nil {
log.Fatalf("无法获取文件状态: %v", err)
}

// 3. 创建 PDF Reader
reader, err := pdf.NewReader(f, finfo.Size())
if err != nil {
log.Fatalf("无法创建 PDF Reader: %v", err)
}

// 4. 获取总页数
numPages := reader.NumPage()
fmt.Printf("PDF 总页数: %d\n", numPages)

// 5. 遍历并提取每一页的纯文本
for i := 1; i <= numPages; i++ {
page := reader.Page(i)

// 校验当前页是否为空
if page.V.IsNull() {
continue
}

// 提取文本
text, err := page.GetPlainText(nil)
if err != nil {
log.Printf("第 %d 页提取文本失败: %v", i, err)
continue
}

fmt.Printf("--- 第 %d 页内容 ---\n", i)
fmt.Println(text)
}
}