| | |
| | | { ============================================================================== |
| | | 方法名稱:StatrTwainScan |
| | | 引用相依:OnAcquire, Scanner, Scanner.AcquireWithSourceOpen, Scanner.CloseSour |
| | | ce, Scanner.OpenSource, StatrTwainScan, TTiffGraphic |
| | | 方法描述:啟動 TWAIN 掃瞄流程。此方法首先檢查掃瞄器驅動是否已安裝,接著初始化 Sc |
| | | anInfo 結構並設定掃瞄參數(如 DPI、影像格式、是否顯示 UI、雙面掃瞄模式、 |
| | | 亮度與對比)。流程中會開啟掃瞄來源,呼叫 AcquireWithSourceOpen 執行實際 |
| | | 掃瞄作業,並利用 try...finally 確保不論掃瞄成功與否,最終都會關閉掃瞄 |
| | | 來源並釋放資源。 |
| | | 引用相依:OnAcquire, Scanner, Scanner.AcquireWithSourceOpen, Scanner.CloseSource, |
| | | Scanner.OpenSource, StatrTwainScan, TTiffGraphic |
| | | 方法描述:【啟動 TWAIN 掃描流程】 |
| | | 此方法負責初始化掃描器環境並執行影像獲取作業。 |
| | | 1. 驅動檢查:確認 Scanner.IsConfigured,若未安裝則提示使用者。 |
| | | 2. 資訊初始化:配置 TScanInfo 結構,設定多頁模式並建立 TTiffGraphic 容器。 |
| | | 3. 參數設定:套用掃描 DPI (ScanDpi)、影像格式 (ScanColor) 及 UI 顯示模式 |
| | | (TwainShowUI)。 |
| | | 4. 來源配置:開啟掃描來源 (OpenSource),根據掃描模式 (ScanDuplex) 設定雙面 |
| | | 功能,並在樣本掃描模式 (SAMPLESCAN) 下強迫關閉雙面。 |
| | | 5. 影像校調:若 ScanImgSetUse 為真,則套用亮度 (ScanBright) 與對比 |
| | | (ScanContrast) 設定。 |
| | | 6. 執行獲取:呼叫 AcquireWithSourceOpen 並掛載 OnAcquire 回調函數。 |
| | | 7. 資源釋放:利用巢狀 try...finally 確保在任何異常發生時都能正確關閉掃描 |
| | | 來源並釋放圖形物件。 |
| | | ============================================================================== } |
| | | procedure TCB_IMGPSScanX.StatrTwainScan; |
| | | var ScanInfo : TScanInfo; |
| | |
| | | |
| | | { ============================================================================== |
| | | 方法名稱:OnAcquire |
| | | 引用相依:OnAcquire, TJpegGraphic, TTiffGraphic |
| | | 方法描述:掃瞄影像獲取後的回呼處理函數。核心邏輯包含: |
| | | 1. 將獲取的 DIB 句柄轉為影像對象並設定 DPI。 |
| | | 2. 依影像格式執行對應處理:黑白影像會進行條碼辨識、依條碼角度旋轉、影像 |
| | | 反向、傾斜矯正及清黑邊;全彩或灰階影像則設定 JPEG 壓縮品質。 |
| | | 3. 檢查是否需要進行 A3 切割為 A4 的處理。 |
| | | 4. 透過 Deletepage 檢查並過濾空白頁(依據檔案大小)。 |
| | | 5. 對於有效影像,更新 UI 顯示並呼叫 PageEnd 決定儲存路徑與檔名,最後依 |
| | | 副檔名儲存為 TIFF 或 JPEG 並呼叫 PageDone 完成頁面流程。 |
| | | 引用相依:CheckNeedCrop, CleanupBorder, ConvertToGray, CropImg, DeskewImg, |
| | | DeviceDelete, DeviceDeleteSize, FJpgCompression, MpsBarcodeinf, |
| | | MpsGetBarcode, NegativeImg, OnAcquire, PageDone, PageEnd, Rotate, |
| | | ScannerReverse, ScanDeskew, TJpegGraphic, TTiffGraphic |
| | | 方法描述:【掃描影像獲取回調處理】 |
| | | 當掃描器完成一張影像獲取時由 TWAIN 驅動程式觸發,負責核心影像處理。 |
| | | 1. 影像載入:將 DibHandle 轉換為 TTiffGraphic,並套用 XDpi/YDpi。 |
| | | 2. 格式化處理: |
| | | - 黑白影像:執行條碼辨識 (MpsGetBarcode),若條碼具角度則進行旋轉校正; |
| | | 依據設定執行影像反向 (NegativeImg)、去偏斜 (DeskewImg) 及清黑邊 |
| | | (CleanupBorder);設定為 Group4 壓縮。 |
| | | - 彩色/灰階:執行條碼辨識,套用 JPEG 壓縮及品質設定 (FJpgCompression)。 |
| | | 3. A3 裁切處理:呼叫 CheckNeedCrop 判定是否為 A3 橫置,若符合則將影像垂直 |
| | | 裁切為左右兩頁。 |
| | | 4. 空白頁過濾:若啟用 DeviceDelete,會透過 Deletepage 計算影像串流大小, |
| | | 小於 DeviceDeleteSize 則判定為空白並捨棄。 |
| | | 5. 自動旋轉:對處理後的每一頁再次進行條碼偵測,若條碼顯示角度不符則執行 |
| | | 最後的 Rotate。 |
| | | 6. 檔案儲存:調用 PageEnd 決定檔名 (PEFileName),依副檔名執行 TIF 附加 |
| | | (AppendToStream) 或 JPG 覆蓋儲存。 |
| | | 7. UI 同步:每完成一頁儲存後呼叫 PageDone 更新介面顯示。 |
| | | ============================================================================== } |
| | | procedure TCB_IMGPSScanX.OnAcquire( const DibHandle : THandle; |
| | | const XDpi : Word; |
| | |
| | | |
| | | { ============================================================================== |
| | | 方法名稱:PageDone |
| | | 引用相依:LoadFromFile, PageDone |
| | | 方法描述:完成單頁影像處理後的 UI 更新邏輯。此方法會遞增掃瞄影像總計數,並根據目 |
| | | 前的掃瞄模式(新建、取代、插入或取樣)將儲存好的影像檔載入到對應的 Image |
| | | ScrollBox 元件中。在新建模式下,還會根據 ScanImgShowMode 設定決定影像 |
| | | 顯示的品質(反鋸齒開啟與否)與縮放模式(zmFittopage),確保使用者能即時預 |
| | | 覽掃瞄結果。 |
| | | 引用相依:FindISB2View, LoadFromFile, PageDone, TImageScrollBox |
| | | 方法描述:【單頁影像處理完成後的介面同步】 |
| | | 在影像成功儲存至磁碟後,更新系統內部的影像計數器與顯示元件。 |
| | | 1. 計數累加:更新 Scaninfo.ImageCount。 |
| | | 2. 模式分支處理: |
| | | - smNew (新建):根據 ScanImgShowMode 決定顯示品質(清晰/模糊)或不顯示。 |
| | | 使用 FindISB2View 尋找對應的顯示容器。 |
| | | - smReplace (取代):直接載入至 DisplayISB。 |
| | | - smInsert/smSample (插入/取樣):載入影像並設定為自動縮放至頁面寬度。 |
| | | 3. 反鋸齒設定:若需清晰顯示,則啟動 AntiAliased 以提升預覽品質。 |
| | | ============================================================================== } |
| | | procedure TCB_IMGPSScanX.PageDone; |
| | | Var |
| | |
| | | |
| | | { ============================================================================== |
| | | 方法名稱:PageEnd |
| | | 引用相依:DirectoryExists, GetNoNameCase, PageEnd, SaveToFile, Str2Dir, _DelTr |
| | | ee |
| | | 方法描述:管理掃瞄影像的儲存路徑與檔案命名規則。主要邏輯如下: |
| | | 1. 辨識條碼以取得 FormID,並判斷是否為導引頁或分案頁。 |
| | | 2. 若偵測到分案頁,會重置計數並嘗試取得新的案件編號(CaseID)。 |
| | | 3. 確定儲存目錄,包含處理「分份數」邏輯(依 DocNoNeedDiv 決定是否建立新 |
| | | 子目錄)。 |
| | | 4. 根據目前頁數與 FormID 產生標準化的檔名(如補零序號_FormID.tif)。 |
| | | 5. 更新 ContextList(影像索引資訊)並在掃瞄新案件時更新 TreeView UI 結 |
| | | 構。此方法確保每張影像都能正確歸類到對應的案件與文件目錄下。 |
| | | 引用相依:Add_Zoo, BarCode2CaseID, BarCode2FormID, DirectoryExists, |
| | | FindDivFormCode, FindLastestDocDir, FormCode2DocNo, GetDocDir_Page, |
| | | GetNoNameCase, ISDivPageFormID, ISGuideFormID, PageEnd, SetCaseList, |
| | | SetContextList, SetDocNoList, Str2Dir, _DelTree |
| | | 方法描述:【掃描分案與儲存路徑管理】 |
| | | 這是控制掃描流程中「自動分案」與「檔案命名」的核心邏輯方法。 |
| | | 1. 條碼解析:從 MpsBarcodeinf 提取 FormID 與 CaseID。 |
| | | 2. 自動分案邏輯 (smNew): |
| | | - 識別分案頁 (DivPageFormID) 與導引頁 (GuideFormID)。 |
| | | - 偵測到分案條碼時,自動切換 ScanCaseno,清除舊有的 View 與索引, |
| | | 實現批次掃描自動分拆案件。 |
| | | 3. 目錄建立:根據案件編號與文件類型 (DocNo) 自動建立樹狀目錄。 |
| | | - 若案件路徑已存在且為首頁掃描,則會執行 _DelTree 清空舊資料。 |
| | | - 使用 Str2Dir 確保實體路徑層級完整。 |
| | | 4. 文件分份處理:呼叫 DocNoNeedDiv 判定是否需根據份數另建子目錄 (如 001, |
| | | 002...)。 |
| | | 5. 命名規則: |
| | | - 一般文件:序號(3位) + '_' + FormID + 副檔名。 |
| | | - 附件:序號(3位) + 副檔名。 |
| | | 6. 結構同步:更新 TreeView 樹狀結構,並透過 SetContextList 與 |
| | | SetCaseList 將新掃描的影像資訊寫入系統索引檔。 |
| | | ============================================================================== } |
| | | procedure TCB_IMGPSScanX.PageEnd; |
| | | Var |
| | |
| | | |
| | | { ============================================================================== |
| | | 方法名稱:R_W_Scanini |
| | | 引用相依:Scanner |
| | | 方法描述:讀取或寫入掃瞄設定檔(FBScan.ini)。此方法使用 Tinifile 物件處理掃瞄相 |
| | | 關參數的 I/O 作業。當 Mode 為 'R' 時,從設定檔讀取包含空白頁刪除設定、 |
| | | 影像反向、清黑邊、旋轉角度、傾斜矯正、亮度對比以及 UI 顯示模式等參數;當 |
| | | Mode 為 'W' 時,則將目前的系統變數值回寫至設定檔中,以利下次啟動時恢復 |
| | | 使用者的個性化設定。 |
| | | 引用相依:Tinifile |
| | | 方法描述:【掃描設定檔持久化管理】 |
| | | 負責 FBScan.ini 設定檔的讀取與寫入作業,確保使用者的掃描偏好得以跨診次保留。 |
| | | 1. 讀取模式 ('R'):從 ini 讀取空白頁刪除 (DeviceDelete)、影像反向、清黑邊、 |
| | | 旋轉角度、去偏斜、亮度對比及顯示模式等參數。若設定不存在則採用系統預設值。 |
| | | 2. 寫入模式 ('W'):將目前的掃描環境變數同步至 ini 檔案中。 |
| | | 3. 參數對照:包含 DeviceDeleteSize (空白頁判定門檻) 及 ScanImgSetUse (是否 |
| | | 覆蓋掃描器內建調校) 等關鍵邏輯開關。 |
| | | ============================================================================== } |
| | | Procedure TCB_IMGPSScanX.R_W_Scanini(Mode:Char); //'R'讀取;'W'寫入 |
| | | var |
| | |
| | | |
| | | { ============================================================================== |
| | | 方法名稱:GetDefScanIni |
| | | 引用相依:FJpgCompression, Rotate, Scanner |
| | | 方法描述:從資料庫參數清單(WORK_INF_List)初始化並設定掃瞄的系統預設值。流程首先 |
| | | 設定一組程式內建的預設數值,隨後遍歷 WORK_INF_List 並比對 PARA_NO 關 |
| | | 鍵字,動態更新包含:空白頁判斷大小、影像是否反相、清黑邊、掃瞄 DPI、雙面掃 |
| | | 瞄開啟、影像旋轉角度、傾斜矯正、亮度對比、影像儲存路徑、導引頁與分案頁代 |
| | | 碼列表、以及 JPEG 壓縮品質等關鍵參數。這使得掃瞄行為可以透過後台設定進 |
| | | 行彈性調整。 |
| | | 引用相依:GetSQLData, WORK_INF_List |
| | | 方法描述:【系統預設參數初始化】 |
| | | 從資料庫的參數列表 (WORK_INF_List) 中載入系統全局掃描設定。 |
| | | 1. 基礎防呆:預設 DPI 為 300,空白頁門檻為 3072 bytes。 |
| | | 2. 參數對照表:遍歷 WORK_INF_List,將資料庫代碼轉化為布林值或數值。 |
| | | - SCAN_BLANKDEL_USE/SIZE: 空白頁過濾開關與大小。 |
| | | - SCAN_DPI / SCAN_DUPLEX: 掃描解析度與雙面模式。 |
| | | - SCAN_ROTATE_MODE: 定義 0, 90, 180, 270 度旋轉映射。 |
| | | - GUIDEFORMID / DIVPAGEFORMID: 定義自動分案用的表單特徵代碼。 |
| | | 3. 特殊邏輯:處理進件截止時間 (ScanDenialTime) 與上傳限制 (FMaxUploadSize) |
| | | 等業務邏輯控制變數。 |
| | | ============================================================================== } |
| | | Procedure TCB_IMGPSScanX.GetDefScanIni; //取得掃瞄的預設值 |
| | | var |
| | |
| | | |
| | | { ============================================================================== |
| | | 方法名稱:initkscan |
| | | 引用相依:Scanner, Scanner.CloseSource, Scanner.OpenSource, initkscan |
| | | 方法描述:初始化並偵測掃瞄器硬體能力。此方法會先將雙面掃瞄勾選框(ScanDuplexCB) |
| | | 設為停用,接著嘗試開啟掃瞄來源(OpenSource),檢查掃瞄器是否支援雙面掃瞄 |
| | | 功能(DuplexCap > 0)。如果硬體支援,則啟用 UI 上的勾選框供使用者選擇。最 |
| | | 後確保關閉掃瞄來源,若過程中發生異常,會呼叫 DataLoading(False,True) |
| | | 停止載入狀態提示。 |
| | | 引用相依:Scanner, Scanner.CloseSource, Scanner.OpenSource |
| | | 方法描述:【掃描器硬體能力偵測】 |
| | | 在掃描開始前探測掃描器支援的功能特性。 |
| | | 1. UI 控制:預設關閉雙面掃描勾選框 (ScanDuplexCB)。 |
| | | 2. 硬體握手:嘗試 OpenSource,成功後讀取 Scanner.DuplexCap。 |
| | | 3. 動態啟用:若硬體回報 DuplexCap > 0,則動態啟用介面上的雙面掃描選項, |
| | | 供使用者勾選。 |
| | | 4. 例外保護:若開啟來源失敗,則觸發 DataLoading(False,True) 並優雅結束偵測。 |
| | | ============================================================================== } |
| | | procedure TCB_IMGPSScanX.initkscan; |
| | | begin |