创建用于pdf操作的自定义模块

时间:2019-04-16 13:22:40

标签: kofax

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

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

  • 创建Kofax导出脚本
  • 向Kofax添加自定义模块

我有一个 APIRef.chm (Kofax.Capture.SDK.CustomModule)和 CMSplit 作为示例项目。不幸的是,我很难融入其中。有没有逐步展示如何进入定制模块开发的资源?

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

我只想知道如何设置“ Hello World”示例并向其中添加代码,我认为我什至不需要WinForms应用程序,因为我只需要操作PDF文件即可。 ..

2 个答案:

答案 0 :(得分:2)

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

  • AscentCaptureRuntime
    • 批次
      • 文件
        • 文档

单个文档本身具有诸如页面之类的子元素,以及诸如ConfidenceFormTypeNamePDFGenerationFileName之类的多个属性。这就是你想要的。浏览文档集合的方法如下,将文件名存储在名为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)。

references

设置部分

添加新的User ControlWindows 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();

    }
}

注册,COM可见性等

注册自定义模块是通过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

最后但并非最不重要的一点是,确保您的程序集对COM可见: com-visible

我将整个代码放在GitHub上,可以随意进行分叉。希望对您有所帮助。