Golang如何读取PDF文件

Golang如何读取PDF文件 如何在 Go 语言中读取 PDF 文件

3 回复

打开文件,读取字节。完成。

……或者你所说的“读取”是指什么?

更多关于Golang如何读取PDF文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


虽然没有亲自尝试过,但我听说这个包很不错。

GitHub图标

GitHub - unidoc/unipdf

头像

unidoc/unipdf

用于创建和处理PDF文件的Golang PDF库(纯Go实现)- unidoc/unipdf

在 Go 语言中读取 PDF 文件,推荐使用 github.com/unidoc/unipdf/v3 库。以下是具体实现示例:

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/unidoc/unipdf/v3/extractor"
    "github.com/unidoc/unipdf/v3/model"
)

func main() {
    // 打开 PDF 文件
    file, err := os.Open("example.pdf")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    // 创建 PDF 阅读器
    pdfReader, err := model.NewPdfReader(file)
    if err != nil {
        log.Fatal(err)
    }

    // 获取 PDF 页数
    numPages, err := pdfReader.GetNumPages()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("PDF 总页数: %d\n", numPages)

    // 逐页提取文本内容
    for pageNum := 1; pageNum <= numPages; pageNum++ {
        page, err := pdfReader.GetPage(pageNum)
        if err != nil {
            log.Fatal(err)
        }

        // 创建文本提取器
        ex, err := extractor.New(page)
        if err != nil {
            log.Fatal(err)
        }

        // 提取文本
        text, err := ex.ExtractText()
        if err != nil {
            log.Fatal(err)
        }

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

安装依赖:

go get github.com/unidoc/unipdf/v3

如果需要读取 PDF 元数据,可以使用以下代码:

func readPDFMetadata(pdfReader *model.PdfReader) {
    pdfInfo, err := pdfReader.GetPdfInfo()
    if err != nil {
        log.Fatal(err)
    }

    if pdfInfo.Title != nil {
        fmt.Printf("标题: %s\n", pdfInfo.Title.String())
    }
    if pdfInfo.Author != nil {
        fmt.Printf("作者: %s\n", pdfInfo.Author.String())
    }
    if pdfInfo.Subject != nil {
        fmt.Printf("主题: %s\n", pdfInfo.Subject.String())
    }
    if pdfInfo.Creator != nil {
        fmt.Printf("创建工具: %s\n", pdfInfo.Creator.String())
    }
}

对于需要处理加密 PDF 的情况:

func readEncryptedPDF(filename, password string) {
    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    pdfReader, err := model.NewPdfReader(file)
    if err != nil {
        log.Fatal(err)
    }

    // 检查是否加密
    isEncrypted, err := pdfReader.IsEncrypted()
    if err != nil {
        log.Fatal(err)
    }

    if isEncrypted {
        // 尝试使用密码解密
        auth, err := pdfReader.Decrypt([]byte(password))
        if err != nil {
            log.Fatal(err)
        }
        if !auth {
            log.Fatal("密码错误")
        }
    }

    // 继续处理解密后的 PDF...
}

如果需要提取图片:

func extractImages(page *model.PdfPage) {
    resources := page.Resources
    if resources == nil {
        return
    }

    // 获取页面中的所有图片
    xObject, err := resources.GetXObjectForm()
    if err != nil {
        log.Fatal(err)
    }

    for _, xobj := range xObject {
        if img, ok := xobj.(*model.XObjectImage); ok {
            // 处理图片数据
            fmt.Printf("找到图片: %v\n", img)
        }
    }
}

这些示例展示了在 Go 中读取 PDF 文件的基本操作,包括文本提取、元数据读取、加密文件处理和图片提取。

回到顶部