|
剛剛結(jié)束的一個事情,僅限于完成了任務(wù)。 一、任務(wù)描述 有一個超巨型的資料性的文件,是網(wǎng)頁上查詢之后的結(jié)果,有幾百頁、幾百筆資料,需要把里面的資料一條一條的列在一個單獨立的文件里面,并且,文件用“組序號-標(biāo)識-名稱.pdf”來命名。 組序號由另一份Excel文件給出,每組之中有標(biāo)識和名稱域與超巨pdf中的相應(yīng)域?qū)?yīng)。 難點: 1、不能手工操作。不易一一對應(yīng),且不產(chǎn)生馬虎和疏忽的錯誤。 2、沒有長期時間。大致實測,一筆資料從信息提取、標(biāo)識對應(yīng)、生成新文件、按規(guī)則命名大約3分鐘左右時間,1000筆資料大約50小時,每天8小時不動,大約6天,一周。一周下來,估計人也就廢了。我相信這事兒沒有兩周干不下來。 3、不易協(xié)同作業(yè)。Excel文件規(guī)格不盡相同,且超巨pdf不便擴(kuò)散,所以最好是一下子over。 二、任務(wù)分解 1、根據(jù)標(biāo)識號拆分超巨pdf。這一步可以在python里用PyPDF2包完成。 2、規(guī)范Excel格式和內(nèi)容。這一步在Excel里面用排序、函數(shù)和VBA足夠,之后導(dǎo)出為csv,便于最終Delphi處理它們。 3、根據(jù)標(biāo)識和名稱對應(yīng)并拼接資料,按標(biāo)識生成單個pdf文件。由于所有資料都沒有放置在數(shù)據(jù)庫里,因此統(tǒng)一按字段當(dāng)成格式文本來搜索是否有匹配。無匹配時,再巡回一次,避免標(biāo)識不在指定的位置上。 三、功能片斷 1、拆分超巨pdf。 部分代碼: ''' 分拆一個多頁大pdf文件為指定頁數(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#文件的尾頁頁數(shù) for i in range(pageNum): pdf_splitter(path,i,i+1) 2、pdf能否正常被搜索。若能,pyPDF2可通過PdfFileReader正常導(dǎo)出文本,否則可以OCR,或者pdf轉(zhuǎn)word,再從word轉(zhuǎn)到txt,進(jìn)入Delphi查詢。 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ù)列的判斷。排序,上或下錯開1行,或錯開1列,if。略。 4、Delphi拼接每筆資料,并生成pdf文件。 先python生成pdf文件,留出來標(biāo)識,Delphi通過標(biāo)識,讀取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)識號',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 //重命名開始 for i := 0 toFileListBox1.Items.Count - 1 do begin myf :=FileListBox1.Items[i]; //找組名和名稱 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);//給點兒寫磁盤時間 end; showmessage('OK!'); end; 四、幾點討論 1、非圖片版的pdf就一定能提取其中的文本嗎?感覺是不一定!盡管中英文各種網(wǎng)絡(luò)中介紹各種方法處理pdf的文字提取問題,但是,確實是碰到了提取不了的情況。提取出來的文字,不是特殊編碼,也并非全是亂碼,查詢N久,沒解決,挺困惑。 2、不是一定圖片版的pdf才需要OCR,這個不用解釋了。 3、為什么不用python一擼到底?在python語言大行其道的今天,python幾乎無所不能了,但還存在一個熟悉程度的問題。Delphi太熟悉了,同等工作量,當(dāng)然熟悉的工具最快了。而且,python寫GUI在一個老Delphier面前,弱爆了。 |
|
|
來自: 新用戶5228KeDY > 《待分類》