知識管理系統(tǒng)Data Solution研發(fā)日記之三 文檔解決方案_第1頁
知識管理系統(tǒng)Data Solution研發(fā)日記之三 文檔解決方案_第2頁
知識管理系統(tǒng)Data Solution研發(fā)日記之三 文檔解決方案_第3頁
知識管理系統(tǒng)Data Solution研發(fā)日記之三 文檔解決方案_第4頁
知識管理系統(tǒng)Data Solution研發(fā)日記之三 文檔解決方案_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

6/6知識管理系統(tǒng)DataSolution研發(fā)日記之三文檔解決方案知識管理系統(tǒng)DataSolution研發(fā)日記之三文檔解決方案

前面兩篇文章已經(jīng)展示了DataSolution的設(shè)計(jì)目標(biāo)和為達(dá)到此目標(biāo)而設(shè)計(jì)的應(yīng)用程序,這一篇繼續(xù)細(xì)化對它的介紹,講解DataSolution如何對文件進(jìn)行掃描,轉(zhuǎn)換,存儲,檢索。本機(jī)磁盤的文件格式通常是doc/docx,pdf,pst/ost/eml,htm/mht,txt/rtf,這幾種格式是電腦中常用的格式。要達(dá)到在同一個編輯器Editor中可以對它們進(jìn)行編輯,再整理,需要選擇一種通用的格式,把其它的格式轉(zhuǎn)化為這種通用格式,對這種格式進(jìn)行編輯。DOC/DOCX格式功能強(qiáng)大,有很多開源類型庫對它進(jìn)行讀寫,RTF格式也包含了豐富數(shù)據(jù)資料,重要的一點(diǎn)是RTF格式,是一種開放的格式。可以到微軟的網(wǎng)站上下載《MicrosoftOfficeWord2021RichTextFormat(RTF)Specification》,以熟悉這種文件格式。開放格式的好處之一是,在后續(xù)的進(jìn)一步開發(fā)中,可以找到很多現(xiàn)有的功能和代碼,包括開放的源碼。所以,DataSolution選擇RTF格式作為文件存儲的標(biāo)準(zhǔn)格式。

下一個目標(biāo)就是要找到RTF格式的編輯工具,通過Google可以找到很多RTF格式的編輯器,對RTF格式進(jìn)行直接編輯,存儲和轉(zhuǎn)換。因?yàn)槭情_放格式,微軟的.NETFramework自帶了RichTextBox,可用于RTF格式的編輯。不過,這個控件還需要強(qiáng)化,可以到CodeP上找到一些工具和文章。

這兩個關(guān)鍵的步驟解決了,下面就是設(shè)計(jì)數(shù)據(jù)庫和設(shè)計(jì)數(shù)據(jù)讀寫代碼。創(chuàng)建Document數(shù)據(jù)庫,文檔表的腳本如下CREATETABLE[dbo].[DOCUMENT]([RECNUM][int]IDENTITY(1,1)NOTNULL,[SUBJECT][nvarchar](2000)NULL,[BODY_TYPE][nvarchar](50)NULL,[BODY][nvarchar](max)NULL,[CREATE_DATE][datetime]NULL,[CREATE_BY][nvarchar](50)NULL,[REVISED_Date][datetime]NULL,[REVISED_BY][nvarchar](50)NULL,[CATEGORY][int]NULL,[COMPUTER][nvarchar](200)NULL,[PATH][nvarchar](2000)NULL,CONSTRAINT[PK_DOCUMENT]PRIMARYKEYCLUSTERED([RECNUM]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY])ON[PRIMARY]

Body就是存儲文檔的表字段,設(shè)計(jì)它為NVARCHAR(MAX)類型,CATEGORY用于文檔的分類查找,SUBJECT可存放關(guān)鍵字或是標(biāo)題,BODY_TYPE用于全文搜索,存儲文檔類型擴(kuò)展名。COMPUTER和PATH用于在本機(jī)掃描中,指定原始文檔的路徑,可用于追蹤。

DataSolution系統(tǒng)選擇LLBLGenFramework作為數(shù)據(jù)庫訪問層的代碼生成器,生成解決(方案)的代碼如下圖

來看一下,對文檔進(jìn)行保存的一段代碼,它是標(biāo)準(zhǔn)的LLBLGenFramework的routine代碼publicDocumentEntitySaveDocument(DocumentEntitydoc){using(DataAccessAdapteradapter=GetDataAccessAdapter()){try{adapter.StartTransaction(IsolationLevel.ReadCommitted,"SaveDocument");adapter.SaveEntity(doc,true,false);adapter.Commit();}catch{adapter.Rollback();throw;}}returndoc;}

所謂routine代碼,就是代碼可以由模板生成的,就好比上下班打卡一樣,是很平常的簡單的行為。

注意這里的throw代碼,它沒有寫成這樣catch(Exceptionex){adapter.Rollback();throwex;}

在《.NET框架程序設(shè)計(jì)》一書中,解釋了這兩個throw的區(qū)別,它們會產(chǎn)生不同的stacktrace,異常的起始點(diǎn)不同。

基礎(chǔ)層面的問題解決了,下面的應(yīng)用程序就水到渠成,以不同的方式導(dǎo)入文檔到數(shù)據(jù)庫中。

BatchImport批次導(dǎo)入指定目錄的文件到數(shù)據(jù)庫中

DocScanner批次導(dǎo)入指定格式的文件到數(shù)據(jù)庫中

PDFWatcher專用于PDF文件格式的轉(zhuǎn)換,導(dǎo)入,因?yàn)槭荳atcher,所以你肯定會想到是個FileSystemWatcher

DocLoader適用于單個文檔的轉(zhuǎn)換,導(dǎo)入,一次只處理一個文檔

再來看數(shù)據(jù)庫中的文檔的展示,DocumentExplorer會展現(xiàn)導(dǎo)入進(jìn)數(shù)據(jù)庫的原始文件,在這里可以進(jìn)行預(yù)覽,刪除,分類。分類之后,這個文檔就好比打上了合格的標(biāo)簽一樣,可以在以后的程序中進(jìn)一步使用。否則,不分類的文件都會只停留在這里,后繼的步驟無法處理。這是個文檔流程上的的.Policy,如果不喜歡這個步驟,可以去掉。

DocumentBrowser分類查看文檔

左邊是樹型結(jié)構(gòu),右邊是從屬于這個分類的文檔。如果要對掃描進(jìn)數(shù)據(jù)庫中的文件進(jìn)行分類,可以這樣操作

在DocumentExplorer中選中一個或多個文件,點(diǎn)擊右鍵CategoryDocument

在DocumentBrowser的左邊的樹中,右鍵PasteDocument

之后就看到了效果,在.NET結(jié)點(diǎn)下面,展示了所Paste的文檔及其屬性

DocumentBrowser左邊的樹是文檔的分類,可對它對進(jìn)新增子節(jié)點(diǎn),新增加一個分類的效果如下圖

Category是取自數(shù)據(jù)庫中的類別表,它的腳本定義如下CREATETABLE[dbo].[CATEGORY]([RECNUM][int]IDENTITY(1,1)NOTNULL,[NAME][nvarchar](200)NULL,CONSTRAINT[PK_CATEGORY]PRIMARYKEYCLUSTERED([RECNUM]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY])ON[PRIMARY]

這顆文檔分類樹,它的結(jié)構(gòu)定義是放到本地的XML文件中,上圖中所看到的樹的格式定義如下

如上圖所示,tag就是從數(shù)據(jù)庫中獲取的分類定義,依據(jù)這個標(biāo)識,以檢索分類的文檔。在DocumentBrowser窗體的打開與關(guān)閉時,它會持久化樹的結(jié)構(gòu)定義,代碼如下protectedoverridevoidOnClosed(EventArgse){base.OnClosed(e);TreeViewSerializerserializer=newTreeViewSerializer();serializer.SerializeTreeView(this.treeView,treeFile);}protectedoverridevoidOnLoad(EventArgse){treeView.ImageList=this.imageList;TreeNoderoot=treeView.Nodes[0];if(File.Exists(treeFile)){treeView.Nodes.Clear();TreeViewSerializerserializer=newTreeViewSerializer();serializer.DeserializeTreeView(this.treeView,treeFile);treeView.ExpandAll();}}

如果你對如何把樹節(jié)點(diǎn)定義保存到文件系統(tǒng)中感興趣,可以用關(guān)鍵字TreeViewSerializer在CodeProject中查找,這里的代碼就是取自其中一篇文章的代碼。

還有另一個地方,會用到樹型結(jié)構(gòu)分類,在Editor編輯器的打開文件對話框中,如下圖所示

這里的效果,與DocumentBrowser的效果是完全一樣的。原來以為是可以用CustomOpenFileDialog來解決OpenFile對話框的PlaceBar的問題,也就是上圖中看到的左邊的樹的分類,也是如下圖中紅色邊框包圍的地方

要達(dá)到重寫紅色區(qū)域,Windows有規(guī)定的路徑,并且會驗(yàn)證這個路徑,這個辦法沒有通過,無奈之下才用的自定義對話框。之前見到過的軟件,SharePointDesigner重寫過這個PlaceBar區(qū)域,可惜沒有領(lǐng)悟它的實(shí)現(xiàn)原理。

寫到這里,還沒有完成,這里還需要一點(diǎn)OFFICE二次開發(fā)的知識,在OFFICE軟件中,寫入一個插件,可以把正在瀏覽的文檔,直接導(dǎo)入到我的文檔數(shù)據(jù)庫中,如下圖所示

這里已經(jīng)安裝了兩個插件,NitroPDFProfessional和Acrobat,用于把當(dāng)前DOC/DOCX文檔轉(zhuǎn)換為PDF文件。所以,還需要寫一個把當(dāng)前的DOC/DOCX文檔轉(zhuǎn)存到文檔數(shù)據(jù)庫中的插件。

在把PDF轉(zhuǎn)化為可以編輯的RTF格式過程中,遇到了不少的麻煩。把DOC/DOCX轉(zhuǎn)換成PDF,這個行為,有很多開源代碼可以借用,但是,倒過來,把PDF轉(zhuǎn)換成DOC/DOCX,這個組件卻不好找。有一種方案是把PDF轉(zhuǎn)化為TIFF,然后再用OCR軟件系統(tǒng)(ABBYYFineReader9)來轉(zhuǎn)成DOC/DOCX文件。我們做程序員的窮,沒有那么多銀子買昂貴的SDKLicense,轉(zhuǎn)向?qū)ふ褻rack或是Patch之類的,也沒有結(jié)果。這些業(yè)界領(lǐng)先的技術(shù),連Trial版本都不會出現(xiàn)在網(wǎng)上,根本沒有機(jī)會Trial一把,或是把它放到虛擬機(jī)里面,永遠(yuǎn)以Trial的方式來使用。有的組件,比如PDFFocus.NET,可以試用一把,可是轉(zhuǎn)換出來的文件,要么加上了Trial的水印,要么只能轉(zhuǎn)換前三頁,后面的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論