剛剛結(jié)束的一個(gè)事情,僅限于完成了任務(wù)。 一、任務(wù)描述 有一個(gè)超巨型的資料性的文件,是網(wǎng)頁(yè)上查詢(xún)之后的結(jié)果,有幾百頁(yè)、幾百筆資料,需要把里面的資料一條一條的列在一個(gè)單獨(dú)立的文件里面,并且,文件用“組序號(hào)-標(biāo)識(shí)-名稱(chēng).pdf”來(lái)命名。 組序號(hào)由另一份Excel文件給出,每組之中有標(biāo)識(shí)和名稱(chēng)域與超巨pdf中的相應(yīng)域?qū)?yīng)。 難點(diǎn): 1、不能手工操作。不易一一對(duì)應(yīng),且不產(chǎn)生馬虎和疏忽的錯(cuò)誤。 2、沒(méi)有長(zhǎng)期時(shí)間。大致實(shí)測(cè),一筆資料從信息提取、標(biāo)識(shí)對(duì)應(yīng)、生成新文件、按規(guī)則命名大約3分鐘左右時(shí)間,1000筆資料大約50小時(shí),每天8小時(shí)不動(dòng),大約6天,一周。一周下來(lái),估計(jì)人也就廢了。我相信這事兒沒(méi)有兩周干不下來(lái)。 3、不易協(xié)同作業(yè)。Excel文件規(guī)格不盡相同,且超巨pdf不便擴(kuò)散,所以最好是一下子over。 二、任務(wù)分解 1、根據(jù)標(biāo)識(shí)號(hào)拆分超巨pdf。這一步可以在python里用PyPDF2包完成。 2、規(guī)范Excel格式和內(nèi)容。這一步在Excel里面用排序、函數(shù)和VBA足夠,之后導(dǎo)出為csv,便于最終Delphi處理它們。 3、根據(jù)標(biāo)識(shí)和名稱(chēng)對(duì)應(yīng)并拼接資料,按標(biāo)識(shí)生成單個(gè)pdf文件。由于所有資料都沒(méi)有放置在數(shù)據(jù)庫(kù)里,因此統(tǒng)一按字段當(dāng)成格式文本來(lái)搜索是否有匹配。無(wú)匹配時(shí),再巡回一次,避免標(biāo)識(shí)不在指定的位置上。 三、功能片斷 1、拆分超巨pdf。 部分代碼: ''' 分拆一個(gè)多頁(yè)大pdf文件為指定頁(yè)數(shù)的小pdf子文件 以下代碼在py3Anaconda 4.3.30、pypdf2-1.26.0 生成的子文件保存在本腳本文件所在的目錄下 ''' from PyPDF2 import PdfFileReader, PdfFileWriter def pdf_splitter(path,start,end): pdf = PdfFileReader(path) pdf_writer =PdfFileWriter() output_filename ='page_{}.pdf'.format(end+300) for page inrange(start,end): pdf_writer.addPage(pdf.getPage(page)) print(page) withopen(output_filename,'wb') as out: pdf_writer.write(out) print('Created:{}'.format(output_filename)) path = 'F:/a/301368.pdf' pageNum=68#文件的尾頁(yè)頁(yè)數(shù) for i in range(pageNum): pdf_splitter(path,i,i+1) 2、pdf能否正常被搜索。若能,pyPDF2可通過(guò)PdfFileReader正常導(dǎo)出文本,否則可以OCR,或者pdf轉(zhuǎn)word,再?gòu)?/span>word轉(zhuǎn)到txt,進(jìn)入Delphi查詢(xún)。 from PyPDF2 import PdfFileReader filename = 'F:/a/PT/page_2.pdf' pdf = PdfFileReader(open(filename, "rb")) pageNum=pdf.getNumPages() text='' for i in range(0, pageNum): text+=pdf.getPage(i).extractText() print(text) 3、Excel重復(fù)行、重復(fù)列的判斷。排序,上或下錯(cuò)開(kāi)1行,或錯(cuò)開(kāi)1列,if。略。 4、Delphi拼接每筆資料,并生成pdf文件。 先python生成pdf文件,留出來(lái)標(biāo)識(shí),Delphi通過(guò)標(biāo)識(shí),讀取csv,重命名文件。 uses FileCtrl; procedure TForm1.Button1Click(Sender: TObject); var txtFile: TextFile; s: string; begin AssignFile(txtFile, 'F:\a\XLS_idname.txt'); Reset(txtFile); while not eof(txtFile) do begin readln(txtFile, s); //讀取一行保存到字符串s中 //if pos('標(biāo)識(shí)號(hào)',s)<>0then Memo1.Lines.Add(s); //在Memo1中顯示 end; end; procedure TForm1.Button2Click(Sender: TObject); begin FileListBox1.Directory :='F:\a\b'; end; procedure TForm1.Button3Click(Sender: TObject); var myf, Newf: string; i, j: integer; begin //重命名開(kāi)始 for i := 0 toFileListBox1.Items.Count - 1 do begin myf :=FileListBox1.Items[i]; //找組名和名稱(chēng) for j := 0 tomemo1.Lines.Count - 1 do begin if pos(LeftStr(myf, 8),memo1.Lines[j]) <> 0 then break; end; Newf :=StringReplace(memo1.Lines[j], ',', '-', [rfReplaceAll]); ReNameFile('F:\a\b\' +myf, 'F:\a\c\' + Newf + '.pdf'); sleep(50);//給點(diǎn)兒寫(xiě)磁盤(pán)時(shí)間 end; showmessage('OK!'); end; 四、幾點(diǎn)討論 1、非圖片版的pdf就一定能提取其中的文本嗎?感覺(jué)是不一定!盡管中英文各種網(wǎng)絡(luò)中介紹各種方法處理pdf的文字提取問(wèn)題,但是,確實(shí)是碰到了提取不了的情況。提取出來(lái)的文字,不是特殊編碼,也并非全是亂碼,查詢(xún)N久,沒(méi)解決,挺困惑。 2、不是一定圖片版的pdf才需要OCR,這個(gè)不用解釋了。 3、為什么不用python一擼到底?在python語(yǔ)言大行其道的今天,python幾乎無(wú)所不能了,但還存在一個(gè)熟悉程度的問(wèn)題。Delphi太熟悉了,同等工作量,當(dāng)然熟悉的工具最快了。而且,python寫(xiě)GUI在一個(gè)老Delphier面前,弱爆了。 |
|
來(lái)自: 新用戶(hù)5228KeDY > 《待分類(lèi)》