2026-05-12 12:30:03 +08:00
|
|
|
package office
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"io"
|
2026-05-12 12:36:41 +08:00
|
|
|
"os"
|
2026-05-12 12:30:03 +08:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"apigo.cc/go/file"
|
|
|
|
|
"github.com/dslipak/pdf"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// PDF 封装了 PDF 文档的读取操作。
|
|
|
|
|
type PDF struct {
|
|
|
|
|
filename string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// OpenPDF 打开一个 PDF 文档。
|
|
|
|
|
func OpenPDF(filename string) (*PDF, error) {
|
|
|
|
|
if !file.Exists(filename) {
|
2026-05-12 12:36:41 +08:00
|
|
|
return nil, os.ErrNotExist
|
2026-05-12 12:30:03 +08:00
|
|
|
}
|
|
|
|
|
return &PDF{filename: filename}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Text 提取 PDF 中的所有文本。
|
|
|
|
|
func (p *PDF) Text() (string, error) {
|
|
|
|
|
f, err := pdf.Open(p.filename)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var b bytes.Buffer
|
|
|
|
|
t, err := f.GetPlainText()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = io.Copy(&b, t)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return b.String(), nil
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-12 12:36:41 +08:00
|
|
|
// ToMarkdown 将 PDF 内容转换为 Markdown 格式。
|
|
|
|
|
func (p *PDF) ToMarkdown() (string, error) {
|
|
|
|
|
text, err := p.Text()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
return text, nil
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-12 12:30:03 +08:00
|
|
|
// Info 获取 PDF 的元数据。
|
|
|
|
|
func (p *PDF) Info() map[string]any {
|
|
|
|
|
f, err := pdf.Open(p.filename)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info := make(map[string]any)
|
2026-05-12 12:36:41 +08:00
|
|
|
trailer := f.Trailer()
|
|
|
|
|
infoDict := trailer.Key("Info")
|
|
|
|
|
if !infoDict.IsNull() {
|
|
|
|
|
for _, field := range infoDict.Keys() {
|
|
|
|
|
val := infoDict.Key(field).Text()
|
|
|
|
|
if val != "" {
|
|
|
|
|
info[strings.ToLower(field)] = val
|
|
|
|
|
}
|
2026-05-12 12:30:03 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
info["pages"] = f.NumPage()
|
|
|
|
|
return info
|
|
|
|
|
}
|