当前位置:  开发笔记 > 编程语言 > 正文

检查PDF文件是否有效(Python)

如何解决《检查PDF文件是否有效(Python)》经验,为你挑选了3个好方法。

我通过HTTP-Upload获取文件,需要确保它是一个pdf文件.编程语言是Python,但这不重要.

我想到了以下解决方案:

    检查字符串的第一个字节是否为"%PDF".这不是一个好的检查,但可以防止使用意外上传其他文件.

    尝试使用libmagic(bash上的"file"命令使用它).这与1的检查完全相同.

    拿一个lib并尝试从文件中读取页数.如果lib能够读取页数,那么它应该是有效的pdf.问题:我不知道python的lib可以做到这一点

所以任何人都有lib或其他技巧的解决方案?

谢谢



1> WoJ..:

由于显然既不存在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



2> Van Gale..:

两个最常用的Python PDF库是:

pyPdf

ReportLab的

两者都是纯python,因此应该易于安装以及跨平台.

使用pyPdf它可能就像做:

from pyPdf import PdfFileReader
doc = PdfFileReader(file("upload.pdf", "rb"))

这应该是足够了,但doc现在有documentInfo()numPages()方法,如果你想要做进一步的检查.

正如Carl回答的那样,pdftotext也是一个很好的解决方案,对于非常大的文档(特别是那些有很多交叉引用的文档)可能会更快.然而,由于分支新进程的系统开销等原因,小PDF可能会慢一些.



3> MrTopf..:

在一个项目,如果我的我需要检查一些上传文件的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命令可以提供更大的灵活性.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有