- 相關(guān)推薦
知識(shí)管理系統(tǒng)Data Solution研發(fā)日記之三 文檔解決方案
前面兩篇文章已經(jīng)展示了Data Solution的設(shè)計(jì)目標(biāo)和為達(dá)到此目標(biāo)而設(shè)計(jì)的應(yīng)用程序,這一篇繼續(xù)細(xì)化對(duì)它的介紹,講解Data Solution如何對(duì)文件進(jìn)行掃描,轉(zhuǎn)換,存儲(chǔ),檢索。本機(jī)磁盤的文件格式通常是doc/docx,pdf,pst/ost/eml,htm/mht,txt/rtf,這幾種格式是電腦中常用的格式。要達(dá)到在同一個(gè)編輯器Editor中可以對(duì)它們進(jìn)行編輯,再整理,需要選擇一種通用的格式,把其它的格式轉(zhuǎn)化為這種通用格式,對(duì)這種格式進(jìn)行編輯。DOC/DOCX格式功能強(qiáng)大,有很多開源類型庫對(duì)它進(jìn)行讀寫,RTF格式也包含了豐富數(shù)據(jù)資料,重要的一點(diǎn)是RTF格式,是一種開放的格式?梢缘轿④浀木W(wǎng)站上下載《Microsoft Office Word 2003 Rich Text Format (RTF) Specification》,以熟悉這種文件格式。開放格式的好處之一是,在后續(xù)的進(jìn)一步開發(fā)中,可以找到很多現(xiàn)有的功能和代碼,包括開放的源碼。所以,Data Solution選擇RTF格式作為文件存儲(chǔ)的標(biāo)準(zhǔn)格式。
下一個(gè)目標(biāo)就是要找到RTF格式的編輯工具,通過Google可以找到很多RTF格式的編輯器,對(duì)RTF格式進(jìn)行直接編輯,存儲(chǔ)和轉(zhuǎn)換。因?yàn)槭情_放格式,微軟的.NET Framework自帶了RichTextBox,可用于RTF格式的編輯。不過,這個(gè)控件還需要強(qiáng)化,可以到CodeProject.com上找到一些工具和文章。
這兩個(gè)關(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就是存儲(chǔ)文檔的表字段,設(shè)計(jì)它為NVARCHAR(MAX)類型,CATEGORY用于文檔的分類查找,SUBJECT可存放關(guān)鍵字或是標(biāo)題,BODY_TYPE用于全文搜索,存儲(chǔ)文檔類型擴(kuò)展名。COMPUTER和PATH用于在本機(jī)掃描中,指定原始文檔的路徑,可用于追蹤。
Data Solution系統(tǒng)選擇LLBL Gen Framework作為數(shù)據(jù)庫訪問層的代碼生成器,生成解決方案的代碼如下圖
來看一下,對(duì)文檔進(jìn)行保存的一段代碼,它是標(biāo)準(zhǔn)的LLBL Gen Framework的routine代碼 public DocumentEntity SaveDocument(DocumentEntity doc) { using (DataAccessAdapter adapter = GetDataAccessAdapter()) { try { adapter.StartTransaction(IsolationLevel.ReadCommit ted, "SaveDocument"); adapter.SaveEntity(doc, true, false); adapter.Commit(); } catch { adapter.Rollback(); throw; } } return doc; }
所謂routine代碼,就是代碼可以由模板生成的,就好比上下班打卡一樣,是很平常的簡單的行為。
注意這里的throw代碼,它沒有寫成這樣 catch(Exception ex) { adapter.Rollback(); throw ex; }
在《.NET框架程序設(shè)計(jì)》一書中,解釋了這兩個(gè)throw的區(qū)別,它們會(huì)產(chǎn)生不同的stack trace,異常的起始點(diǎn)不同。
基礎(chǔ)層面的問題解決了,下面的應(yīng)用程序就水到渠成,以不同的方式導(dǎo)入文檔到數(shù)據(jù)庫中。
Batch Import 批次導(dǎo)入指定目錄的文件到數(shù)據(jù)庫中
Doc Scanner 批次導(dǎo)入指定格式的文件到數(shù)據(jù)庫中
PDF Watcher 專用于PDF文件格式的轉(zhuǎn)換,導(dǎo)入,因?yàn)槭荳atcher,所以你肯定會(huì)想到是個(gè)FileSystemWatcher
Doc Loader 適用于單個(gè)文檔的轉(zhuǎn)換,導(dǎo)入,一次只處理一個(gè)文檔
再來看數(shù)據(jù)庫中的文檔的展示,Document Explorer會(huì)展現(xiàn)導(dǎo)入進(jìn)數(shù)據(jù)庫的原始文件,在這里可以進(jìn)行預(yù)覽,刪除,分類。分類之后,這個(gè)文檔就好比打上了合格的標(biāo)簽一樣,可以在以后的程序中進(jìn)一步使用。否則,不分類的文件都會(huì)只停留在這里,后繼的步驟無法處理。這是個(gè)文檔流程上的的Policy,如果不喜歡這個(gè)步驟,可以去掉。
Document Browser 分類查看文檔
左邊是樹型結(jié)構(gòu),右邊是從屬于這個(gè)分類的文檔。如果要對(duì)掃描進(jìn)數(shù)據(jù)庫中的文件進(jìn)行分類,可以這樣操作
在Document Explorer中選中一個(gè)或多個(gè)文件,點(diǎn)擊右鍵Category Document
在Document Browser的左邊的樹中,右鍵Paste Document
之后就看到了效果,在.NET結(jié)點(diǎn)下面,展示了所Paste的文檔及其屬性
Document Browser左邊的樹是文檔的分類,可對(duì)它對(duì)進(jìn)新增子節(jié)點(diǎn),新增加一個(gè)分類的效果如下圖
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ù)這個(gè)標(biāo)識(shí),以檢索分類的文檔。在Document Browser窗體的打開與關(guān)閉時(shí),它會(huì)持久化樹的結(jié)構(gòu)定義,代碼如下 protectedoverridevoid OnClosed(EventArgs e) { base.OnClosed(e); TreeViewSerializer serializer = new TreeViewSerializer(); serializer.SerializeTreeView(this.treeView, treeFile); } protectedoverridevoid OnLoad(EventArgs e) { treeView.ImageList = this.imageList; TreeNode root=treeView.Nodes[0]; if (File.Exists(treeFile)) { treeView.Nodes.Clear(); TreeViewSerializer serializer = new TreeViewSerializer(); serializer.DeserializeTreeView(this.treeView, treeFile); treeView.ExpandAll(); } }
如果你對(duì)如何把樹節(jié)點(diǎn)定義保存到文件系統(tǒng)中感興趣,可以用關(guān)鍵字TreeViewSerializer在CodeProject中查找,這里的代碼就是取自其中一篇文章的代碼。
還有另一個(gè)地方,會(huì)用到樹型結(jié)構(gòu)分類,在Editor編輯器的打開文件對(duì)話框中,如下圖所示
這里的效果,與Document Browser的效果是完全一樣的。原來以為是可以用Custom Open File Dialog來解決Open File對(duì)話框的Place Bar的問題,也就是上圖中看到的左邊的樹的分類,也是如下圖中紅色邊框包圍的地方
要達(dá)到重寫紅色區(qū)域,Windows有規(guī)定的路徑,并且會(huì)驗(yàn)證這個(gè)路徑,這個(gè)辦法沒有通過,無奈之下才用的自定義對(duì)話框。之前見到過的軟件,SharePoint Designer重寫過這個(gè)Place Bar區(qū)域,可惜沒有領(lǐng)悟它的實(shí)現(xiàn)原理。
寫到這里,還沒有完成,這里還需要一點(diǎn)OFFICE 二次開發(fā)的知識(shí),在OFFICE軟件中,寫入一個(gè)插件,可以把正在瀏覽的文檔,直接導(dǎo)入到我的文檔數(shù)據(jù)庫中,如下圖所示
這里已經(jīng)安裝了兩個(gè)插件,Nitro PDF Professional和Acrobat,用于把當(dāng)前DOC/DOCX文檔轉(zhuǎn)換為PDF文件。所以,還需要寫一個(gè)把當(dāng)前的DOC/DOCX文檔轉(zhuǎn)存到文檔數(shù)據(jù)庫中的插件。
在把PDF轉(zhuǎn)化為可以編輯的RTF格式過程中,遇到了不少的麻煩。把DOC/DOCX轉(zhuǎn)換成PDF,這個(gè)行為,有很多開源代碼可以借用,但是,倒過來,把PDF轉(zhuǎn)換成DOC/DOCX,這個(gè)組件卻不好找。有一種方案是把PDF轉(zhuǎn)化為TIFF,然后再用OCR軟件系統(tǒng)(ABBYY FineReader 9)來轉(zhuǎn)成DOC/DOCX文件。我們做程序員的窮,沒有那么多銀子買昂貴的SDK License,轉(zhuǎn)向?qū)ふ褻rack或是Patch之類的,也沒有結(jié)果。這些業(yè)界領(lǐng)先的技術(shù),連Trial版本都不會(huì)出現(xiàn)在網(wǎng)上,根本沒有機(jī)會(huì)Trial一把,或是把它放到虛擬機(jī)里面,永遠(yuǎn)以Trial的方式來使用。有的組件,比如PDF Focus.NET,可以試用一把,可是轉(zhuǎn)換出來的文件,要么加上了Trial的水印,要么只能轉(zhuǎn)換前三頁,后面的都不能轉(zhuǎn)換;蛘哂械氖茿ctiveX版本的控件,OCX方式注冊(cè)到系統(tǒng)中,總有這樣那樣的問題。杯具,想想以后要離開對(duì)Microsoft .NET Framework的依賴,離開對(duì)SQL Server的依賴,以這次的經(jīng)驗(yàn)來看,這日子是沒法過了。盡管我已經(jīng)解決了這里的所有問題,仍然不愿意面對(duì),在非數(shù)據(jù)庫開發(fā)的領(lǐng)域,技術(shù)和知識(shí)是很值錢的。因?yàn)槲覀円呀?jīng)習(xí)慣了在數(shù)據(jù)庫領(lǐng)域的開發(fā),技術(shù)和知識(shí)是一文不值的,只有做出的產(chǎn)品才值錢,悲劇。
【知識(shí)管理系統(tǒng)Data Solution研發(fā)日記之三 文檔解決方案】相關(guān)文章:
備件管理系統(tǒng)的解決方案范文(精選5篇)12-29
備品備件管理系統(tǒng)解決方案(通用11篇)12-30
Jordan offers new hosting solution05-04
異地財(cái)務(wù)管理系統(tǒng)解決方案08-20
項(xiàng)目文檔管理辦法06-08
文檔管理制度03-23
電信機(jī)房環(huán)境視頻監(jiān)控系統(tǒng)解決方案03-15
網(wǎng)吧管理系統(tǒng)03-12
研發(fā)管理制度04-25