使用Golang从PDF中提取单词?

14

我不理解类型转换。我知道这不对,我的输出只是一堆象形文字。

f, _ := os.Open("test.pdf") defer f.Close() io.Copy(os.Stdout, f)

我想要处理字符串....


请查看pdfcpu。 - Nilesh
4个回答

10
我尝试了一些Go PDF库,发现sajari/docconv的效果符合我的预期。
易于使用,这是一个示例:
package main

import (
    "fmt"
    "log"

    "code.sajari.com/docconv"
)

func main() {
    res, err := docconv.ConvertPath("your-file.pdf")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

6
请注意,docconv软件包具有依赖项,这些依赖项仅适用于Linux操作系统。 - Max Stevens
1
如果您使用的是Mac OS,请尝试通过命令brew install popplerbrew install tesseract安装依赖项。 - Henry S.

9
由于PDF不仅包含文本,还包含格式(字体、填充、边距、位置、形状、图像)信息,所以这就是原因。
如果您需要阅读没有格式的纯文本,我已经复制了一个存储库并实现了该功能。您可以在https://github.com/ledongthuc/pdf上查看。
我还提供了一个示例,希望对您有所帮助。
package main

import (
    "bytes"
    "fmt"

    "github.com/ledongthuc/pdf"
)

func main() {
    content, err := readPdf("test.pdf") // Read local pdf file
    if err != nil {
        panic(err)
    }
    fmt.Println(content)
    return
}

func readPdf(path string) (string, error) {
    r, err := pdf.Open(path)
    if err != nil {
        return "", err
    }
    totalPage := r.NumPage()

    var textBuilder bytes.Buffer
    for pageIndex := 1; pageIndex <= totalPage; pageIndex++ {
        p := r.Page(pageIndex)
        if p.V.IsNull() {
            continue
        }
        textBuilder.WriteString(p.GetPlainText("\n"))
    }
    return textBuilder.String(), nil
}

3
我使用你的库时遇到了一个 bug,但是无法在 ledongthuc/pdf 的 Git 上发布问题。 - LeMoussel
@LeMoussel,不确定为什么你无法在我的项目中创建问题。但无论如何,你可以在这里发送错误,我会尽力帮助你。 - Le Dong Thuc
@LeMoussel实际上,你可以这样做:https://softwareengineering.stackexchange.com/questions/179468/forking-a-repo-on-github-but-allowing-new-issues-on-the-fork - KrzysztofSzarek
2
@LeDongThuc 使用您的库时,我遇到了以下错误: PDF格式不正确:在偏移量0处读取:流不存在。 - Shaik Sadiq Ahmed
@ShaikSadiqAhmed,你解决了你的问题吗? - lumo
显示剩余2条评论

5

我只得到了一堆象形文字。

你得到的是一个pdf文件的内容,而不是清晰的文本。

如果你想在Go中阅读pdf文件,请使用其中一个golang pdf库,例如rsc.io/pdf,或者那些库之一,例如yob/pdfreader

此处所述:

我怀疑没有任何“坚实的框架”可以处理这种东西。PDF格式的设计并不是为了机器友好,据我所知,没有保证解析任意PDF的方法。


0
你可以尝试使用pdf2go库,结合流行的pdf2go
import (
    "fmt"
    "github.com/rudolfoborges/pdf2go"
)

func main() {
    pdf, err := pdf2go.New("path/to/file.pdf", pdf2go.Config{
        LogLevel: pdf2go.LogLevelError,
    })

    if err != nil {
        panic(err)
    }

    text, err := pdf.Text()
    if err != nil {
        panic(err)
    }

    fmt.Println(text)

    pages, err := pdf.Pages()

    if err != nil {
        panic(err)
    }

    for _, page := range pages {
        fmt.Println(page.Text())
    }
}

你可以提供一个解决方案的例子,并说明它如何帮助问题的提出者,从而改进你的回答。 - Tyler2P
虽然此链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案可能会因链接页面更改而失效。- [来自审查] - AthulMuralidhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接