但是在没有密码的情况下怎么解决呢?
使用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>>









