python 打开pdf文件_Python3检验pdf文件是否有效

【基本原理】

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

【情形一】

pdf文件在磁盘上。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的参数为文件名或文件对象,所以需要做一下转换。

方法一: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

方法二: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判断: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

*** updated * 2018-12-12 ***# encoding: utf-8

# author: walker

# date: 2018-12-12

# summary: 直接用 PDF 文件内容判断 PDF 的正确性和完整性,适用于判断下载的 PDF

import re

def isValidPDF_pathfile(pathfile):

r"""

直接用文件内容判断头尾,

参数为pdf文件全路径名

"""

content = ''

with open(pathfile, mode='rb') as f:

content = f.read()

partBegin = content[0:20]

if partBegin.find(rb'%PDF-1.') < 0:

print('Error: not find %PDF-1.')

return False

idx = content.rfind(rb'%%EOF')

if idx < 0:

print('Error: not find %%EOF')

return False

partEnd = content[(0 if idx-100 < 0 else idx-100) : idx + 5]

if not re.search(rb'startxref\s+\d+\s+%%EOF$', partEnd):

print('Error: not find startxref')

return False

return True

【相关阅读】

*** walker ***

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你理解卷积神经网络

摘要&#xff1a; 卷积神经网络是一种识别和理解图像的神经网络。本文将从不同的层次来介绍卷积神经网络。手把手教你理解卷积神经网络&#xff08;一&#xff09;本文将继续为你介绍关于卷积神经网络的知识。为了保持文章的简洁性和全面性我将为你提供研究论文的链接&#xff…

工作流实战_09_flowable 流程实例挂起与激活

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;我师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都…

2018深圳云栖拉开帷幕,飞天技术汇五大专场邀你参加~

摘要&#xff1a; 感受万物互联的智能时代&#xff0c;洞察数字化转型的全新未来。云栖大会将情景化展示智能城市、智能生活、智能制造、智慧门店等阿里云IoT生态全景&#xff0c;20专场&#xff0c;覆盖AI、新零售等全行业数字化转型解决方案。 飞天技术汇作为阿里云的技术传播…

学了阿里中台,却依然做不好系统? 聊聊阿里的项目管理

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 墨玖来源| 阿里技术导读&#xff1a;在技术公司、尤其是互联网公司&#xff0c;技术人员作为PM(项目经理)是非常常见的。有些同学得心应手&#xff0c;有条不紊&#xff0c;能得到清晰稳定的预期结果&#xff1b;有些同学则…

python382怎么用_教你如何使用Python快速生成验证码

导读 本文教你如何利用Python库random&#xff0c;string生成大小写字母和数字的随机验证码。 利用Python库random&#xff0c;string生成大小写字母和数字的随机验证码 import random import string def generate_code(bit_num)::param bit_num: 生成验证码位数 :return: 返回…

视频直播常见问题与解决办法汇总【系列三—直播推流】

摘要&#xff1a; 直播推流初始化设置 要进行直播推流&#xff0c;您必须开启直播加速 > 配置直播域名 > 直播推流&#xff0c;详情参考 快速开始。 如何获取推流地址 直播加速配置成功后&#xff0c;您可以通过以下方式获取对应的推流地址。 登录 视频直播控制台。 直播…

工作流实战_10_flowable 流程实例的删除

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码2.1. 删除实例命令2.2. 执行删除动作1. 演示 …

深入了解机器学习

摘要&#xff1a; 了解机器学习发展史、机器学习是什么&#xff1f;机器学习有什么&#xff1f;看看本文就够了。如今机器学习已经成为了这个时代的热门话题。机器学习已经存在了几十年&#xff0c;但直到最近我们才得以利用这项技术。接下来&#xff0c;让我们一起回顾一下机器…

python程序设计的基本步骤_Python程序设计课程教与学(54、72、80学时教学大纲)...

原标题&#xff1a;Python程序设计课程教与学&#xff08;54、72、80学时教学大纲&#xff09;《算法与程序设计》课程教学大纲 Programming and Algorithm Fundamentals (Python-based) 一&#xff0e;基本信息 课程学分&#xff1a;4 &#xff1b; 面向专业&#xff1a;计算机…

百分点10周年乔迁新址 数据智能服务更上一层楼

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹2019年8月&#xff0c;是百分点值得纪念和庆祝的日子&#xff0c;随着百分点团队的迅速扩大与蓬勃发展&#xff0c;全国各地业务开展的有声有色&#xff0c;业绩快速增长&#xff0c;在企业成立十周年之际&#xff0c;更…

用Python及深度学习实现iPhone X的FaceID功能

摘要&#xff1a; 本文主要是展示FaceID解锁机器的基本工作机制&#xff0c;采用的方法是基于人脸映射和孪生卷积神经网络&#xff0c;Github上附详细代码。对于果粉们来说&#xff0c;对新出的iPhone X讨论最多的是其解锁方式&#xff0c;TouchID的继承者——FaceID。对于新一…

工作流实战_11_flowable 流程实例 跟踪流程

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public byte[] cre…

企业如何采用机器学习

摘要&#xff1a; 向机器学习专家学习如何理解机器学习开发生命周期&#xff0c;以及如何建立一个团队通过机器学习来解决他们的业务问题。毫无疑问&#xff0c;任何企业都可以利用机器学习的优势将机器学习应用到他们的业务过程中。而机器学习的意义将取决于它是如何被应用的&…

Spark精华问答 | spark的组件构成有哪些?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Spark是一个针对超大数据集合的低延迟的集群分布式计算系统&#xff0c;比MapReducer快40倍左右&#xff0c;是hadoop的升级版本&#xff0c;Hadoop作为第一代产品使用HDFS&#xff0c;第二代加入了Cache来保存中间计算结果&#xf…

binlog日志_mysql 重要日志文件总结

日志是所有应用的重要数据&#xff0c;MySQL 也有错误日志、查询日志、慢查询日志、事务日志等。本文简单总结下各种日志&#xff0c;以备查阅。二进制日志 binlog二进制日志 binlog 用于记录数据库执行的写入性操作(不包括查询)信息&#xff0c;以二进制的形式保存在磁盘中。使…

Python数据预处理:使用Dask和Numba并行化加速

摘要&#xff1a; 本文是针对Python设计一种并行处理数据的解决方案——使用Dask和Numba并行化加速运算速度。案例对比分析了几种不同方法的运算速度&#xff0c;非常直观&#xff0c;可供参考。如果你善于使用Pandas变换数据、创建特征以及清洗数据等&#xff0c;那么你就能够…

工作流实战_12_flowable 流程实例 终止流程

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public ReturnVo&l…

让运维更高效:关于ECS系统事件

摘要&#xff1a; 阿里云会针对ECS实例发布系统事件&#xff0c;当您收到阿里云计划维护的通知时&#xff0c;可以利用ECS系统计划事件了解与实例相关的计划维护操作&#xff0c;并根据您的业务特性选择合适的时间安排运维操作进行故障转移&#xff0c;减少对系统可靠性和业务连…

工作流实战_13_flowable 待办任务列表查询

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://space.bilibili.com/485524575/channel/detail?cid94579 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 这里我使用的sql查…

openlayer xyz加载_webGIS实践:3_1_openlayer展绘点线面注记

上一篇已经讲了&#xff0c;怎么加载瓦片地图。这篇就看看怎么简单的渲染矢量点线面数据。最简单的&#xff0c;绘制点线面注记。效果长这样&#xff1a;新建一个文件FeatureOL.HTML。代码如下&#xff1a;<!DOCTYPE html> <html lang"en"> <head>…