使用第三方库PyPDF2 读取、写入、分割、合并PDF文 安装:pdfplumber 读取PDF文件中内容和提取PDF中的表格 安装:!pip3installPyPDF2复制代码CollectingPyPDF2DownloadingPyPDF21。26。0。tar。gz(77kB)〔K77kB125kBs〔?25hBuildingwheelsforcollectedpackages:PyPDF2BuildingwheelforPyPDF2(setup。py)。。。〔?25ldone〔?25hCreatedwheelforPyPDF2:filenamePyPDF21。26。0py3noneany。whlsize61085sha256dba5825a58d21d37cf9e417039694f1b9e716760ee7b9f0fdcca8fc65b8ef3feStoredindirectory:UserslichizouLibraryCachespipwheelsd9dcec72da68331f30074b9950c1737c23cb8a67484e61498bc9713dSuccessfullybuiltPyPDF2Installingcollectedpackages:PyPDF2SuccessfullyinstalledPyPDF21。26。0复制代码!pip3installpdfplumber复制代码CollectingpdfplumberDownloadingpdfplumber0。5。28。tar。gz(45kB)〔K45kB152kBs〔?25hCollectingpdfminer。six20200517Downloadingpdfminer。six20200517py3noneany。whl(5。6MB)〔K5。6MB145kBs〔?25hCollectingPillow7。0。0DownloadingPillow8。2。0cp39cp39macosx1010x8664。whl(2。8MB)〔K2。8MB70kBs〔?25hCollectingWandDownloadingWand0。6。6py2。py3noneany。whl(138kB)〔K138kB16kBs〔?25hCollectingpycryptodomeDownloadingpycryptodome3。10。1cp35abi3macosx109x8664。whl(1。5MB)〔K1。5MB43kBs〔?25hCollectingsortedcontainersDownloadingsortedcontainers2。4。0py2。py3noneany。whl(29kB)CollectingchardetDownloadingchardet4。0。0py2。py3noneany。whl(178kB)〔K178kB96kBs〔?25hBuildingwheelsforcollectedpackages:pdfplumberBuildingwheelforpdfplumber(setup。py)。。。〔?25ldone〔?25hCreatedwheelforpdfplumber:filenamepdfplumber0。5。28py3noneany。whlsize32219sha25623afcf4aa92bdd0fb4e2a71b0974c1edd5ca9e59b37ef5e41b15fae3bffc5c30Storedindirectory:UserslichizouLibraryCachespipwheelse9cb1bc5dbba18cac53515263c5f26443e4617fa432c32cbaa7d8e48SuccessfullybuiltpdfplumberInstallingcollectedpackages:sortedcontainers,pycryptodome,chardet,Wand,Pillow,pdfminer。six,pdfplumberSuccessfullyinstalledPillow8。2。0Wand0。6。6chardet4。0。0pdfminer。six20200517pdfplumber0。5。28pycryptodome3。10。1sortedcontainers2。4。0复制代码foriinrange(0,10,2):print(i)复制代码02468复制代码批量拆分defsplitpdf(filename,filepath,savedirpath,step5):拆分pdf为多个小pdf文件,paramfilename:要拆分的文件名paramfilepath:要拆分的文件路径paramsavedirpath:保存小的的pdf的文件路径paramstep:每个step页生成一个文件,默认情况,04页问一个文件,59页为第二个文件return:ifnotos。path。exists(savedirpath):os。makedirs(savedirpath)pdfreaderPdfFileReader(filepath)pagespdfreader。getNumPages()forpageinrange(0,pages,step):page取值:list〔0,5,10。。。pages)pdfwriterPdfFileWriter()forindexinrange(page,pagestep):index取值,区间:〔0,5),〔5,10)ifindexpages:防止全部页数不能整除pdfwriter。addPage(pdfreader。getPage(index))逐页添加savepathos。path。join(savedirpath,filenamestr(int(pagestep)1)。pdf)withopen(savepath,wb)asout:pdfwriter。write(out)复制代码fromPyPDF2importPdfFileReaderfromPyPDF2importPdfFileWriter复制代码path易方达中小板指数证券投资基金(LOF)2020年中期报告当前路径下splitpdf(path,path。pdf,testpdf)复制代码批量合并易方达中小板指数证券投资基金(LOF)2020年中期报告1。pdf〔:4〕。replace(易方达中小板指数证券投资基金(LOF)2020年中期报告,)复制代码1复制代码123456789〔:4〕复制代码12345复制代码os。listdir(。testpdf)复制代码〔易方达中小板指数证券投资基金(LOF)2020年中期报告3。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告2。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告1。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告5。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告4。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告6。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告7。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告9。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告8。pdf,易方达中小板指数证券投资基金(LOF)2020年中期报告10。pdf〕复制代码defconcatpdf(filename,readdirpath,savefilepath):合并多个pdf文件paramfilename:文件名paramreaddirpath:要合并的pdf目录paramsavefilepath:合并后的pdf文件路径returnpdfwriterPdfFileWriter()listfilenameos。listdir(readdirpath)listfilename。sort(keylambdax:int(x〔:4〕。replace(filename,)))去掉。pdf,替换文件名,获得文件编号forfninlistfilename:filepathos。path。join(readdirpath,fn)pdfreaderPdfFileReader(filepath)pagespdfreader。getNumPages()forpageinrange(pages):逐页添加pdfwriter。addPage(pdfreader。getPage(page))withopen(savefilepath,wb)asout:pdfwriter。write(out)复制代码concatpdf(易方达中小板指数证券投资基金(LOF)2020年中期报告,。testpdf,concat。pdf)复制代码提取文字内容importpdfplumber复制代码defextractpdftext(pdfpath,pageorder1):提取pdf指定页文字parampdfpath:文件路径parampageorder:页数,〔0,〕;1表示读取全部returnwithpdfplumber。open(pdfpath)aspdf:ifpageorder1:forpageinpdf。pages:print(page。extracttext())returnpagepdf。pages〔pageorder〕print(page。extracttext())复制代码extractpdftext(concat。pdf,0)复制代码易方达中小板指数证券投资基金(LOF)2020年中期报告易方达中小板指数证券投资基金(LOF)2020年中期报告2020年6月30日基金管理人:易方达基金管理有限公司基金托管人:中国建设银行股份有限公司送出日期:二二年八月二十八日复制代码将pdf内容存入txtdefsavepdftextastxt(pdfpath,txtpath,pageorder1):strwithpdfplumber。open(pdfpath)aspdf:ifpageorder1:forpageinpdf。pages:strpage。extracttext()print(page。extracttext())returnpagepdf。pages〔pageorder〕print(page。extracttext())strpage。extracttext()withopen(txtpath,w)asfile:file。write(str)复制代码savepdftextastxt(concat。pdf,concat1。txt,0)复制代码格式丢失defgetpdftext(pdfpath,pageorder1):strwithpdfplumber。open(pdfpath)aspdf:ifpageorder1:forpageinpdf。pages:strpage。extracttext()print(page。extracttext())returnpagepdf。pages〔pageorder〕print(page。extracttext())strpage。extracttext()returnstr复制代码savepath带有文件后缀,因此可以获得文件类型:txt或worddefsavepdftext(str,savepath):pass复制代码提取表格内容importpdfplumber复制代码defextractpdftable(pdfpath,pageorder0):withpdfplumber。open(pdfpath)aspdf:pagepdf。pages〔pageorder〕tableinfopage。extracttables()该页只有一个表格的情况下,设置表格第一行为表头,其余为数据forindexinrange(len(tableinfo)):dftablepd。DataFrame(tableinfo〔index〕〔1:〕,columnstableinfo〔index〕〔0〕)print(index)print(dftable)todo:是否可以合并成1个文件?filenamepdftablestr(pageorder1)str(index1)。csvprint(filename)dftable。tocsv(filename,indexFalse,encodinggbk)gbk能用excel打开,utf8用vscode打开!pip3installPandasRequirementalreadysatisfied:Pandasinusrlocallibpython3。9sitepackages(1。2。4)Requirementalreadysatisfied:pytz2017。3inusrlocallibpython3。9sitepackages(fromPandas)(2021。1)Requirementalreadysatisfied:pythondateutil2。7。3inUserslichizouLibraryPython3。9libpythonsitepackages(fromPandas)(2。8。1)Requirementalreadysatisfied:numpy1。16。5inusrlocallibpython3。9sitepackages(fromPandas)(1。20。3)Requirementalreadysatisfied:six1。5inUserslichizouLibraryPython3。9libpythonsitepackages(frompythondateutil2。7。3Pandas)(1。16。0)importpandasaspdextractpdftable(易方达中小板指数证券投资基金(LOF)2020年中期报告。pdf,6)pdftable7。csvextractpdftable(易方达中小板指数证券投资基金(LOF)2020年中期报告。pdf,7)第8页,单表格pdftable8。csvextractpdftable(易方达中小板指数证券投资基金(LOF)2020年中期报告。pdf,15)第16页,多表格,第一个表格残缺,最终只输出完整的第二个表格pdftable161。csvpdftable162。csvextractpdftable(易方达中小板指数证券投资基金(LOF)2020年中期报告。pdf,14)第15页,表格有部分在第16页,检测是否完全输出:没有,被截断了。bug了pdftable151。csvpdftable152。csv完整的2个表格,第20页extractpdftable(易方达中小板指数证券投资基金(LOF)2020年中期报告。pdf,19)pdftable201。csvpdftable202。csv提取图片内容使用模块fitz,最新版1。18。13和非最新版在部分函数名称上有差异需要先安装PyMuPDF:pip3installPyMuPDF 官方文档:pymupdf。readthedocs。ioenlatest 提取图片的整体逻辑如下:使用fitz打开文档,获取文档详细数据遍历每一个元素,通过正则找到图片的索引位置使用Pixmap将索引对应的元素生成图片通过size函数过滤较小的图片!pip3installPyMuPDFCollectingPyMuPDFDownloadingPyMuPDF1。18。14cp39cp39macosx109x8664。whl(5。6MB)〔K5。6MB5。1MBs〔?25hInstallingcollectedpackages:PyMuPDFSuccessfullyinstalledPyMuPDF1。18。14importfitzimportrepdffitz。open(易方达中小板指数证券投资基金(LOF)2020年中期报告。pdf)xreflenpdf。xreflength()xreflen文档对象个数17912len(pdf)实际pdf页数49导出图片地址picdirpdfexportimgifnotos。path。exists(picdir):os。makedirs(picdir)使用正则表达式来查找图片checkXObjectrType(?XObject)checkImagerSubtype(?Image)遍历pdf对象,找到图像imgcount0forindexinrange(1,xreflen):textpdf。xrefobject(index)isxobjectre。search(checkXObject,text)isimagere。search(checkImage,text)ifisxobjectorisimage:imgcount1根据索引生成图像pixfitz。Pixmap(pdf,index)picfilepathos。path。join(picdir,imgstr(imgcount)。png)pix。size可以反映像素多少,简单的色素块该值较低,可以通过设置一个阈值过滤。以阈值10000为例过滤ifpix。size10000:continue将图片保存为png格式ifpix。n5:pixfitz。Pixmap(fitz。csRGB,pix)pix。writePNG(picfilepath)print(导出图片:str(imgcount))整个pdf只有1张图导出图片:1转存为图片 将每一页转换为一张张图片 安装pdf2image,github:github。comBelvalpdf2 安装:pip3installpdf2image对于mac用户,需要安装popplerforMac:brewinstallpoppler!pip3installpdf2imageCollectingpdf2imageDownloadingpdf2image1。15。1py3noneany。whl(10kB)Requirementalreadysatisfied:pillowinusrlocallibpython3。9sitepackages(frompdf2image)(8。2。0)Installingcollectedpackages:pdf2imageSuccessfullyinstalledpdf2image1。15。1复制代码3种方法,这里使用官方图推荐的更好的一种frompdf2imageimportconvertfrompathimporttempfileimportsend2trashimportshutil肉眼可见的慢defpdfsaveasimg(pdfpath,imgdir):方便测试,send2trash。send2trash(imgdir)ifnotos。path。exists(imgdir):os。makedirs(imgdir)withtempfile。TemporaryDirectory()aspath:ppmconvertfrompath(pdfpath,outputfolderimgdir)将ppm文件保存为png图片forindex,pminenumerate(ppm,1):imgnamepdfnamestr(index)。zfill(2)。pngpm。save(os。path。join(os。path。dirname(pm。filename),imgname))删除ppm文件forroot,dir,fileinos。walk(imgdir):forfinfile:iff〔4:〕。ppm:print(f)send2trash。send2trash(os。path。join(root,f))pdfpath易方达中小板指数证券投资基金(LOF)2020年中期报告。pdfimgdirpdfimg发现生成了。ppm格式的文件,不是图片格式,且命名带有规律,但不是原来的名字ppmpdfsaveasimg(pdfpath,imgdir)help(ppm〔0〕)ppm〔0〕。save(pdfimg。png)type(ppm〔0〕)PIL。PpmImagePlugin。PpmImageFileppm〔0〕。filenamepdfimg76b22d8cb50f4bfeb5eff8b446d7d0ae01。ppm复制代码pdfpath。split(。)〔0〕复制代码易方达中小板指数证券投资基金(LOF)2020年中期报告pdfimg76b22d8cb50f4bfeb5eff8b446d7d0ae01。ppm〔:4〕pdfimg76b22d8cb50f4bfeb5eff8b446d7d0ae01添加水印 使用库:github。com2Douwaterm 步骤: 1。获得一个带水印pdf文件 1。1在图片添加水印,图片插入到word,word保存为pdf 1。2python处理:参考 github。com2Douwaterm mp。weixin。qq。comsoJA6lbsd 2。将水印pdf文件合并到源目标pdf文件的每一页获取水印图片步骤1:省车给你一张透明的水印步骤2:将水印添加到一张空白图上生成水印背景步骤3:将水印背景粘贴到原图对应的位置上去两种水印类型固定位置水印:容易被去除全屏水印:不容易被去除,但可能会影响阅读土办法 法1,直接在word,插入文本框,旋转,设置无边框,注意设置背景透明,然后复制多个。导出为pdf。 法2,word本身自己的增加水印,设计水印自定义文字或图片。缺点是只能是单个水印。给pdf添加水印defaddpdfwatermask(maskpath,pdfpath,savepath):watermaskPdfFileReader(maskpath)watermaskpagewatermask。getPage(0)pdfreaderPdfFileReader(pdfpath)pdfwriterPdfFileWriter()pdfpagenumpdfreader。getNumPages()对pdf的每一页(除了首页),逐页与水印pdf合并,并添加到新的pdfforpageindexinrange(pdfpagenum):currentpagepdfreader。getPage(pageindex)ifpageindex0:第一页不加水印pdfwriter。addPage(currentpage)continuecurrentpage。mergePage(watermaskpage)currentpage。compressContentStreams()压缩内容pdfwriter。addPage(currentpage)保存新的pdf文件withopen(savepath,wb)asout:pdfwriter。write(out)addpdfwatermask(chizou。pdf,concat。pdf,concatwatermarker。pdf) 缺点是水印在内容pdf上方,如果设置过大,颜色不太透明,会遮挡内容。 文档加密与解密 解密:并不是破解,而是在已知密码的情况下解密fromPyPDF2importPdfFileReaderfromPyPDF2importPdfFileWriter加密pdfreaderPdfFileReader(concat。pdf)pdfwriterPdfFileWriter()pagenumpdfreader。getNumPages()forpageindexinrange(pagenum):pdfwriter。addPage(pdfreader。getPage(pageindex))pdfwriter。encrypt(masaikemasaike)先逐页添加页,最后加密withopen(concatencrypt。pdf,wb)asout:必须是wb,二进制打开pdfwriter。write(out)解密:对concatencrypt。pdf解密,另存pdfreaderPdfFileReader(concatencrypt。pdf)pdfreader。decrypt(masaikemasaike)一次性解密pdfwriterPdfFileWriter()pagenumpdfreader。getNumPages()forpageindexinrange(pagenum):pdfwriter。addPage(pdfreader。getPage(pageindex))withopen(concatdecrypt。pdf,wb)asout:pdfwriter。write(out) 作者:秦与商 链接:https:juejin。cnpost7069582991982329893