kofax - 为 pdf 操作创建自定义模块
问题描述
我想创建一个自定义 Kofax 模块。当涉及到批处理时,扫描的文档会转换为 PDF 文件。我想获取这些 PDF 文件,对其进行操作(向 PDF 文档添加自定义页脚)并将它们交还给 Kofax。
所以到目前为止我所知道的:
- 创建 Kofax 导出脚本
- 向 Kofax 添加自定义模块
我有APIRef.chm (Kofax.Capture.SDK.CustomModule) 和CMSplit作为示例项目。不幸的是,我很难进入它。是否有任何资源逐步显示如何进入自定义模块开发?
所以我知道IBatch
界面代表一个选定的批次,IBatchCollection
代表所有批次的集合。
我只想知道如何设置“Hello World”示例并可以将我的代码添加到其中,我认为我什至不需要 WinForms 应用程序,因为我只需要操作 PDF 文件就可以了……
解决方案
Kofax 将批处理公开为 XML,并且DBLite
基本上是所述 XML 的包装器。该结构在 AcBatch.htm 和 AcDocs.htm 中进行了说明(可在 CaptureSV 目录下找到)。这是基本思想(仅显示文档):
- AscentCapture 运行时
- 批
- 文件
- 文档
- 文件
- 批
单个文档本身具有子元素(例如页面)和多个属性(例如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();
}
推荐阅读
- c# - CSharpCompilation 与 Roslyn 在单独的 AppDomain 与 GlobalsType
- wpf - 将 TabControl ItemsSource 和 Headers 绑定在一起
- r - dplyr 中的 percent_rank 函数
- cordova - Ionic 应用程序被应用商店拒绝,因为它不会加载
- python - PyTorch 梯度下降
- machine-learning - Weka 分类器不接受字符串值
- javascript - 对象键集中的传播语法不起作用
- node.js - 节点js函数onWrite在谷歌云功能中无法正常工作
- python - Successfactors API 限制每个请求返回的记录数
- arrays - matlab中的数组和循环