首页 > 解决方案 > 为 pdf 操作创建自定义模块

问题描述

我想创建一个自定义 Kofax 模块。当涉及到批处理时,扫描的文档会转换为 PDF 文件。我想获取这些 PDF 文件,对其进行操作(向 PDF 文档添加自定义页脚)并将它们交还给 Kofax。

所以到目前为止我所知道的:

我有APIRef.chm (Kofax.Capture.SDK.CustomModule) 和CMSplit作为示例项目。不幸的是,我很难进入它。是否有任何资源逐步显示如何进入自定义模块开发?

所以我知道IBatch界面代表一个选定的批次,IBatchCollection代表所有批次的集合。

我只想知道如何设置“Hello World”示例并可以将我的代码添加到其中,我认为我什至不需要 WinForms 应用程序,因为我只需要操作 PDF 文件就可以了……

标签: kofax

解决方案


Kofax 将批处理公开为 XML,并且DBLite基本上是所述 XML 的包装器。该结构在 AcBatch.htm 和 AcDocs.htm 中进行了说明(可在 CaptureSV 目录下找到)。这是基本思想(仅显示文档):

  • AscentCapture 运行时
      • 文件
        • 文档

单个文档本身具有子元素(例如页面)和多个属性(例如ConfidenceFormTypeName和 )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();
}

推荐阅读