利用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 classtempfile — 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 讀取整個檔...