我想创建一个自定义的Kofax模块。当涉及批处理时,扫描的文档将转换为PDF文件。我想获取这些PDF文件,对其进行处理(向PDF文档添加自定义页脚),然后将其交还给Kofax。
所以我到目前为止所知道的:
我有一个 APIRef.chm (Kofax.Capture.SDK.CustomModule)和 CMSplit 作为示例项目。不幸的是,我很难融入其中。有没有逐步展示如何进入定制模块开发的资源?
所以我知道IBatch
接口代表一个选定的批次,而IBatchCollection
代表所有批次的集合。
我只想知道如何设置“ Hello World”示例并向其中添加代码,我认为我什至不需要WinForms应用程序,因为我只需要操作PDF文件即可。 ..
答案 0 :(得分:2)
Kofax将批处理公开为XML,而DBLite
基本上是所述XML的包装。该结构在AcBatch.htm和AcDocs.htm(在CaptureSV目录下找到)中进行了说明。这是基本概念(仅显示文档):
单个文档本身具有诸如页面之类的子元素,以及诸如Confidence
,FormTypeName
和PDFGenerationFileName
之类的多个属性。这就是你想要的。浏览文档集合的方法如下,将文件名存储在名为pdfFileName
的变量中:
IACDataElement runtime = activeBatch.ExtractRuntimeACDataElement(0);
IACDataElement batch = runtime.FindChildElementByName("Batch");
var documents = batch.FindChildElementByName("Documents").FindChildElementsByName("Document");
for (int i = 0; i < documents.Count; i++)
{
// 1-based index in kofax
var pdfFileName = documents[i + 1]["PDFGenerationFileName"];
}
我个人不喜欢这种结构,因此我为其包装创建了自己的包装,但这取决于您。
关于定制模块本身,发货的样品已经是一个不错的开始。基本上,您将拥有一个基本形式,如果用户手动启动该模块,则会显示该形式-如果后面进行工作(最好是Windows服务),则这是完全可选的。我喜欢从控制台应用程序开始,仅在需要时添加表单。在这里,我将启动以下表单,或启动服务。请注意,如果用户要将我的自定义模块作为服务安装,我有不同的分支:
else if (Environment.UserInteractive)
{
// run as module
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new RuntimeForm(args));
}
else
{
// run as service
ServiceBase.Run(new CustomModuleService());
}
}
运行时本身只需将您登录到Kofax Capture,注册事件处理程序并按批处理即可:
// login to KC
cm = new CustomModule();
cm.Login("", "");
// add progress event handlers
cm.BatchOpened += Cm_BatchOpened;
cm.BatchClosed += Cm_BatchClosed;
cm.DocumentOpened += Cm_DocumentOpened;
cm.DocumentClosed += Cm_DocumentClosed;
cm.ErrorOccured += Cm_ErrorOccured;
// process in background thread so that the form does not freeze
worker = new BackgroundWorker();
worker.DoWork += (s, a) => Process();
worker.RunWorkerAsync();
然后,您的CM获取下一批。这可以使用Kofax的批处理通知服务,也可以基于计时器。对于前者,只需处理会话对象的BatchAvailable
事件:
session.BatchAvailable += Session_BatchAvailable;
对于后者,请定义一个计时器-最好具有可配置的轮询间隔:
pollTimer.Interval = pollIntervalSeconds * 1000;
pollTimer.Elapsed += PollTimer_Elapsed;
pollTimer.Enabled = true;
经过计时器后,您可以执行以下操作:
private void PollTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
mutex.WaitOne();
ProcessBatches();
mutex.ReleaseMutex();
}
答案 1 :(得分:2)
由于我意识到您的问题主要是关于如何创建自定义模块,所以请允许我添加另一个答案。从C#控制台应用程序开始。
自定义模块需要以下程序集。它们全部都驻留在KC的Binaries文件夹中(默认为服务器上的C:\Program Files (x86)\Kofax\CaptureSS\ServLib\Bin
)。
添加新的User Control
和Windows Form
进行设置。这纯粹是可选的-CM可能甚至没有安装表格,但是无论如何我建议您添加它。用户控件是最重要的部分,在这里-它将在“ KC管理”中添加菜单项,并初始化表单本身:
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISetupForm
{
[DispId(1)]
AdminApplication Application { set; }
[DispId(2)]
void ActionEvent(int EventNumber, object Argument, out int Cancel);
}
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Quipu.KC.CM.Setup")]
public class SetupUserControl : UserControl, ISetupForm
{
private AdminApplication adminApplication;
public AdminApplication Application
{
set
{
value.AddMenu("Quipu.KC.CM.Setup", "Quipu.KC.CM - Setup", "BatchClass");
adminApplication = value;
}
}
public void ActionEvent(int EventNumber, object Argument, out int Cancel)
{
Cancel = 0;
if ((KfxOcxEvent)EventNumber == KfxOcxEvent.KfxOcxEventMenuClicked && (string)Argument == "Quipu.KC.CM.Setup")
{
SetupForm form = new SetupForm();
form.ShowDialog(adminApplication.ActiveBatchClass);
}
}
}
自从我开始使用控制台应用程序以来,我可以继续并将所有逻辑放入Program.cs
中。请注意,这仅用于演示目的,我建议稍后再添加特定的类和表单。下面的示例登录到Kofax Capture,获取下一个可用批次,然后仅输出其名称。
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) => KcAssemblyResolver.Resolve(eventArgs);
Run(args);
return;
}
static void Run(string[] args)
{
// start processing here
// todo encapsulate this to a separate class!
// login to KC
var login = new Login();
login.EnableSecurityBoost = true;
login.Login();
login.ApplicationName = "Quipu.KC.CM";
login.Version = "1.0";
login.ValidateUser("Quipu.KC.CM.exe", false, "", "");
var session = login.RuntimeSession;
// todo add timer-based polling here (note: mutex!)
var activeBatch = session.NextBatchGet(login.ProcessID);
Console.WriteLine(activeBatch.Name);
activeBatch.BatchClose(
KfxDbState.KfxDbBatchReady,
KfxDbQueue.KfxDbQueueNext,
0,
"");
session.Dispose();
login.Logout();
}
}
注册自定义模块是通过RegAsm.exe
完成的,最好是借助AEX文件。这是一个示例-有关更多详细信息和所有可用设置,请参考文档。
[Modules]
Minimal CM
[Minimal CM]
RuntimeProgram=Quipu/CM/Quipu.KC.CM/Quipu.KC.CM.exe
ModuleID=Quipu.KC.CM.exe
Description=Minimal Template for a Custom Module in C#
Version=1.0
SupportsTableFields=True
SupportsNonImageFiles=True
SetupProgram=Minimal CM Setup
[Setup Programs]
Minimal CM Setup
[Minimal CM Setup]
Visible=0
OCXFile=Quipu/CM/Quipu.KC.CM/Quipu.KC.CM.exe
ProgID=Quipu.KC.CM.Setup
我将整个代码放在GitHub上,可以随意进行分叉。希望对您有所帮助。