Go处理PDF的实现代码

2020-01-28 14:14:18于丽

但是在没有密码的情况下怎么解决呢?

使用qpdf解密

使用qpdf进行强制解密,有些情况是可以解密成功的,但是有些情况也不一定能解密成功

qpdf是一个支持命令行的pdf工具


$ qpdf --decrypt in.pdf out.pdf

使用pdfcpu解密


$ pdfcpu decrypt encrypted.pdf output.pdf

当有密码的情况下,可以使用密码解密:

使用unipdf解密pdf


$ unipdf decrypt -p pass -o output.pdf input.pdf

七、PDF识别

经常会遇到一些场景,比如识别一个文件是不是pdf文件,识别pdf中的文字,识别pdf中的图片等

1.识别pdf中的文字

这里使用xpdf将pdf中的文字解析出来,然后再使用一些字符串操作或者正则表达式进行业务分析

使用xpdf/pdftotext解析pdf中的文本


$ pdftotext input.pdf output.txt

使用unipdf解析pdf中的文本


$ unipdf extract text input.pdf

使用API解析pdf文本,参考unipdf github examples

使用坐标信息解析pdf数据

上面都是先解析出pdf的文本,再根据业务进行处理

还有一种方式是按照坐标位置解析pdf,这种方式更加灵活以及通用,利用的是pdflib/tet


## 输入一组坐标,即可按照坐标解析pdf中的数据
$ tet --pageopt "includebox={{38 707.93 243.91 716.93}}" input.pdf

坐标可以使用tet对pdf进行分析得到一个tetml文件,里面包含了坐标信息:


$ tet --tetml input.pdf

当然也可以用一些其他的方式获取pdf中数据的坐标信息,比如nodejs等

注意: pdflib/tet是收费软件,但是根据官方文档说明,tet提供基础功能,处理不超过10页或者小于1M的pdf文件是不需要购买license的

pdflib/tet提供了命令行工具以及多种语言的sdk支持,比如C/C++/Java/.NET/Perl/PHP/Python/Ruby/Swift 但目前还不支持Go语言,所以对于gopher而言目前只有两种选择:CLI OR CGO

八、修复受损PDF文件

有一些pdf文件在电脑上打开时,显示正常,但是用代码检测却是不正常的,比如在Go中尝试用一个第三方库去解析一个(受损的)pdf:


import (
  "fmt"
  "github.com/rsc.io/pdf"
)

func main() {
  filePath := "path/to/your/broken.pdf"
  _, err := pdf.Open(filePath)
  if err != nil {
    fmt.Println("open pdf failed,err:", err.Error())
    return
  }
}

运行后会得到这样一个结果:

open pdf failed,err: malformed PDF: cross-reference table not found: {5 0 obj}<</Contents 6 0 R /Group <</CS /DeviceRGB /S /Transparency /Type /Group>> /MediaBox [0 0 595.27600098 841.89001465] /Parent 3 0 R /Type /Page>>