Python3检验pdf文件是否有效

简介:

【基本原理】

  利用PyPDF2的PdfFileReader模块打开pdf文件,如果不抛异常,就认为此pdf文件有效。有时打开并不抛出异常,但是有这种警告:UserWarning: startxref on same line as offset [pdf.py:1680]。这种情况pdf多半也是坏的,可进一步通过页数判断。但walker在测试中发现,对于正常pdf文件,进一步通过页数判断时有时会抛出异常。

【情形一】

  pdf文件在磁盘上。    

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import traceback

from PyPDF2 import PdfFileReader    

 

#参数为pdf文件全路径名

def isValidPDF_pathfile(pathfile):

   bValid = True

   try:

       #PdfFileReader(open(pathfile, 'rb'))

       reader = PdfFileReader(pathfile)

       if reader.getNumPages() < 1:    #进一步通过页数判断。

           bValid = False

   except:

       bValid = False

       print('*' + traceback.format_exc())

        

   return bValid

【情形二】

  pdf是来自网络的bytes数据。由于PdfFileReader的参数为文件名或文件对象,所以需要做一下转换。

方法一:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import traceback, tempfile

from PyPDF2 import PdfFileReader    

 

#参数为bytes类型数据。利用临时文件。

def isValidPDF_bytes(pdfBytes):

   bValid = True

   try:

       fp = tempfile.TemporaryFile()

       fp.write(pdfBytes)

       reader = PdfFileReader(fp)

       fp.close()

       if reader.getNumPages() < 1:    #进一步通过页数判断。

           bValid = False

   except:

       bValid = False

       print('*' + traceback.format_exc())

        

   return bValid

方法二:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import io, traceback

from PyPDF2 import PdfFileReader    

 

#参数为bytes类型数据。利用BytesIO转换。

def isValidPDF_bytes(pdfBytes):

   bValid = True

   try:

       b = io.BytesIO(pdfBytes)

       reader = PdfFileReader(b)

       if reader.getNumPages() < 1:    #进一步通过页数判断。

           bValid = False

   except:

       bValid = False

       print('*' + traceback.format_exc())

        

   return bValid


还可以利用PDFlib判断:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

import os

from PDFlib.PDFlib import PDFlib

from PDFlib.PDFlib import PDFlibException

 

def isValidPdf(pathfile):

   p = PDFlib()

 

   p.set_option("license=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx")

   p.set_option("errorpolicy=return");

    

   indoc = p.open_pdi_document(pathfile, 'repair=none');

   print('indoc:' + str(indoc))

   print('pathfile size:' + str(os.path.getsize(pathfile)) + 'B')

   bValid = False

   if (indoc == -1):

       print('*' + p.get_errmsg())

       bValid = False

   else:

       pageNumber = p.pcos_get_number(indoc, "length:pages")

       print('pageNumber:' + str(pageNumber))

       if pageNumber < 1:      #页数为0

           bValid = False

       else:

           bValid = True

    

   if bValid:

       p.close_pdi_document(indoc)

    

   return bValid


参考文档:

1、The PdfFileReader Class

2、tempfile — Generate temporary files and directories

3、io — Core tools for working with streams


*** walker ***

本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1683680如需转载请自行联系原作者


RQSLT

相关文章
|
2月前
|
C#
【PDF提取内容改名】批量提取PDF指定区域内容重命名PDF文件,PDF自动提取内容命名的方案和详细步骤
本工具可批量提取PDF中的合同编号、日期、发票号等关键信息,支持PDF自定义区域提取并自动重命名文件,适用于合同管理、发票处理、文档归档和数据录入场景。基于iTextSharp库实现,提供完整代码示例与百度、腾讯网盘下载链接,助力高效处理PDF文档。
349 40
|
5月前
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
2月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
2月前
|
编译器 Python
如何利用Python批量重命名文件
本文介绍了如何使用Python和PyCharm对文件进行批量重命名,包括文件名前后互换、按特定字符调整顺序等实用技巧,并提供了完整代码示例。同时推荐了第三方工具Bulk Rename Utility,便于无需编程实现高效重命名。适用于需要处理大量文件命名的场景,提升工作效率。
|
3月前
|
编解码 Prometheus Java
当Python同时操作1000个文件时,为什么你的CPU只用了10%?
本文介绍如何构建一个高效的文件处理系统,解决单线程效率低、多线程易崩溃的矛盾。通过异步队列与多线程池结合,实现任务调度优化,提升I/O密集型操作的性能。
65 4
|
3月前
|
人工智能 索引 Python
[oeasy]python094_使用python控制音符列表_midi_文件制作
本文介绍了如何使用Python控制音符列表制作MIDI文件。首先回顾了列表下标索引(正数和负数)的用法,接着通过`mido`库实现MIDI文件生成。以《两只老虎》为例,详细解析了代码逻辑:定义音高映射、构建旋律列表、创建MIDI文件框架,并将音符插入音轨。还探讨了音符时值与八度扩展的实现方法。最终生成的MIDI文件可通过不同平台播放或编辑。总结中提到,此技术可用于随机生成符合调性的旋律,同时引发对列表其他实际应用的思考。
95 5
|
2月前
|
数据采集 监控 算法
Python文件与目录比较全攻略:从基础操作到性能优化
文件比较的核心在于数据指纹校验,通过逐字节比对生成唯一标识,确保内容一致性。从标准库的os与filecmp到高性能第三方库如pydiffx,再到分布式与量子加密技术的未来趋势,文件比较广泛应用于数据备份、代码审查与系统监控等领域,是保障数据完整性的关键技术手段。
74 0
|
5月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
251 69
|
2月前
|
前端开发 安全 Java
办公自动化必修课:用Python打造PDF全能处理工具
在职场中,PDF处理常令人崩溃:拆分、合并、加密等问题严重影响效率。本文教你用Python打造一个包含拆分、合并、加密、水印四大功能的PDF工具箱,通过实战代码提升办公自动化水平,让文档操作像拼乐高一样简单高效。
115 0
|
4月前
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
147 10

推荐镜像

更多