Python3檢驗pdf檔案是否有效

2021-10-23 20:25:52 字數 3955 閱讀 6836

利用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檔案全路徑名

defisvalidpdf_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型別資料。利用臨時檔案。

defisvalidpdf_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轉換。

defisvalidpdf_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

defisvalidpdf

(pathfile)

: p = pdflib(

) p.set_option(

"license=******-******-******-******-******"

) 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

import re

defisvalidpdf_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<

0else idx-

100)

: idx +5]

ifnot re.search(rb'startxref\s+\d+\s+%%eof$'

, partend)

:print

('error: not find startxref'

)return

false

return

true

the pdffilereader class

tempfile — generate temporary files and directories

io — core tools for working with streams

python3 將pdf檔案轉為text

pdf檔案儘管可以用python提取文字,但存在加密的情況,那種pdf就是解析不了的。另外pdf更類似於,所以即使可以用python提取,結果也容易有問題。所以效果不敢保證。在python3中解析pdf一般用pdfminer3k,就是pdfminer的python3版本。直接pip安裝即可 pip ...

python3 抽取PDF文字

coding utf 8 import datetime import re import sys import time from datetime import timedelta from io import stringio from pdfminer.converter import te...

python 3讀取檔案 Python3 檔案讀寫

python open 方法用於開啟乙個檔案,並返回檔案物件,在對檔案進行處理過程都需要使用到這個函式 1.讀取檔案 with open test json dumps.txt mode r encoding utf 8 as f seek 移動游標至指定位置 f.seek 0 read 讀取整個檔...