我通过HTTP-Upload获取文件,需要确保它是一个pdf文件.编程语言是Python,但这不重要.
我想到了以下解决方案:
检查字符串的第一个字节是否为"%PDF".这不是一个好的检查,但可以防止使用意外上传其他文件.
尝试使用libmagic(bash上的"file"命令使用它).这与1的检查完全相同.
拿一个lib并尝试从文件中读取页数.如果lib能够读取页数,那么它应该是有效的pdf.问题:我不知道python的lib可以做到这一点
所以任何人都有lib或其他技巧的解决方案?
谢谢
由于显然既不存在PyPdf
也不ReportLab
可用,我发现的当前解决方案(截至2015年)是使用PyPDF2
和捕获异常(并可能分析getDocumentInfo()
)
import PyPDF2 with open("testfile.txt", "w") as f: f.write("hello world!") try: PyPDF2.PdfFileReader(open("testfile.txt", "rb")) except PyPDF2.utils.PdfReadError: print("invalid PDF file") else: pass
两个最常用的Python PDF库是:
pyPdf
ReportLab的
两者都是纯python,因此应该易于安装以及跨平台.
使用pyPdf它可能就像做:
from pyPdf import PdfFileReader doc = PdfFileReader(file("upload.pdf", "rb"))
这应该是足够了,但doc
现在有documentInfo()
和numPages()
方法,如果你想要做进一步的检查.
正如Carl回答的那样,pdftotext也是一个很好的解决方案,对于非常大的文档(特别是那些有很多交叉引用的文档)可能会更快.然而,由于分支新进程的系统开销等原因,小PDF可能会慢一些.
在一个项目,如果我的我需要检查一些上传文件的mime类型.我只是使用这样的文件命令:
from subprocess import Popen, PIPE filetype = Popen("/usr/bin/file -b --mime -", shell=True, stdout=PIPE, stdin=PIPE).communicate(file.read(1024))[0].strip()
您当然可能希望将实际命令移动到某个配置文件中,因为命令行选项也会因操作系统(例如mac)而异.
如果您只是需要知道它是否是PDF而且无论如何都不需要处理它我认为file命令比lib更快.当然也可以手动完成,但如果要检查不同类型,file命令可以提供更大的灵活性.