为自定义模块创建安装表格

时间:2019-04-23 14:23:59

标签: kofax

我有一个自定义模块,在PDFGenerator完成后立即执行。我按照本指南介绍了如何创建自定义模块

https://stackoverflow.com/a/55799101/9945420

在处理批处理文档时,我要处理生成的PDF文件并将页脚添加到该文件中。该页脚的内容需要在“管理”模块中进行配置。

因此,在名为“ StampOnScanProcess”的项目中,我添加了一个名为“ Setup”的文件夹,其中包含两个文件。名为“ FrmSetup”的Form

public partial class FrmSetup : Form
{
    private IBatchClass batchClass;

    public FrmSetup()
    {
        InitializeComponent();
    }

    public DialogResult ShowDialog(IBatchClass batchClass)
    {
        this.batchClass = batchClass;

        // Load previous Settings ...

        return this.ShowDialog();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void btnSave_Click(object sender, EventArgs e)
    {
        // Save ...

        this.Close();
    }
}

和一个名为“ UserCtrlSetup”的UserControl

[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(CUSTOM_MODULE_NAME_SETUP)]
public partial class UserCtrlSetup : UserControl, ISetupForm
{
    private const string CUSTOM_MODULE_NAME_SETUP = "StampOnScanProcess.Setup";

    private AdminApplication adminApplication;

    public AdminApplication Application
    {
        set
        {
            value.AddMenu(CUSTOM_MODULE_NAME_SETUP, CUSTOM_MODULE_NAME_SETUP, "BatchClass");
            adminApplication = value;
        }
    }

    public void ActionEvent(int EventNumber, object Argument, out int Cancel)
    {
        Cancel = 0;

        if ((KfxOcxEvent)EventNumber == KfxOcxEvent.KfxOcxEventMenuClicked && (string)Argument == CUSTOM_MODULE_NAME_SETUP)
        {
            FrmSetup form = new FrmSetup();
            form.ShowDialog(adminApplication.ActiveBatchClass);
        }
    }
}

我修改了我的注册文件并向其中添加了设置表格

[Modules]
StampOnScanProcess

[StampOnScanProcess]
RuntimeProgram=StampOnScanProcess.exe
ModuleID=StampOnScanProcess.exe
Description=...
Version=10.2
SupportsNonImageFiles=True
SupportsTableFields=True
SetupProgram=StampOnScanProcess.Setup

[Setup Programs]
StampOnScanProcess.Setup

[StampOnScanProcess.Setup]
Visible=0
OCXFile=StampOnScanProcess.exe
ProgID=StampOnScanProcess.Setup

启动管理模块时,我转到批处理类属性 => 队列,并想通过单击属性调用此设置表单>中间的按钮。

enter image description here

不幸的是,属性按钮被禁用,所以我无法打开设置表单。该表格被添加到批处理类的上下文菜单中

enter image description here

如何将该表格绑定到属性按钮?在运行时应用程序执行后,存储已配置数据并访问它的最佳方法是什么?

我需要考虑如何存储数据,因为某些用户具有用户个人资料

enter image description here

,并且运行时应用程序当前没有凭据登录。

    public void LoginToRuntimeSession()
    {
        login = new Login();
        login.EnableSecurityBoost = true;
        login.Login();
        login.ApplicationName = CUSTOM_MODULE_ID;
        login.Version = "1.0";
        login.ValidateUser($"{CUSTOM_MODULE_ID}.exe", false, "", "");
        session = login.RuntimeSession;
    }

所以可能我也必须在设置时存储凭据。

1 个答案:

答案 0 :(得分:2)

  

我该如何将此表单绑定到属性按钮?

与菜单项的所有交互均由ISetupForm.ActionEvent处理。使用AddMenu对象的AdminApplication方法添加新条目。 Kofax按名称区分多个条目-假设您可以同时具有多个菜单条目,一个在批处理类级别,另一个在文档类级别,以及功能区中的另一个-仅举几个例子。 Kofax在集成到管理中的任何组件(例如自定义模块或工作流代理)中都使用相同的方法。

这是我们组件之一的示例。请注意,在BatchClass级别添加了三个条目,在DocumentClass级别添加了另外两个条目。

value.AddMenu("BatchClass.GeneralConfig", "Field Panel - General Configuration", "BatchClass");
value.AddMenu("BatchClass.FieldEditor", "Field Panel - Configure Batch Fields", "BatchClass");
value.AddMenu("DocumentClass.FieldEditor", "Field Panel - Configure Index Fields", "DocumentClass");
value.AddMenu("CopyBatchFieldConfig", "Field Panel - Copy Batch Field Configuration", "BatchClass");
value.AddMenu("PasteBatchFieldConfig", "Field Panel - Paste Batch Field Configuration", "BatchClass");
value.AddMenu("CopyIndexFieldConfig", "Field Panel - Copy Index Field Configuration", "DocumentClass");
value.AddMenu("PasteIndexFieldConfig", "Field Panel - Paste Index Field Configuration", "DocumentClass");

每个条目都不会通过其事件文本(第一个参数)来标识。例如,BatchClass.GeneralConfig用于在批处理类级别打开通用配置对话框。

现在,回到我们的ActionEvent-这是我如何区分用户选择的条目:

if ((KfxOcxEvent)EventNumber == KfxOcxEvent.KfxOcxEventMenuClicked)
{
    AdminForm form = new AdminForm();
    switch ((string)Argument)
    {
        case "BatchClass.GeneralConfig":
            ConfigureGeneral(kcApp.ActiveBatchClass);
            break;
  

[I]想要通过单击以下内容中的“属性”按钮来调用此设置表单:   中间。

我不知道您是否可以使用此按钮-我会假设是-但就我个人而言,我倾向于将设置放在批处理级别或文档类级别。例如-您的PDF批注设置可能因文档类而异-在此级别上输入条目似乎更自然。

  

什么是存储配置的数据并在什么时候访问它的最佳方法   运行时应用程序被执行?

自定义存储字符串,您可以在这里尽情发挥自己的想象力。最简单的方法是在设置期间存储键值对,然后在运行时检索它们。这是一个通用调用(BatchClassIBatchClass对象,即指向ActiveBatchClass对象的AdminApplication属性的指针):

// set a CSS
BatchClass.set_CustomStorageString(name, value);
// get a CSS
BatchClass.get_CustomStorageString(name)

我通常只使用一个自定义存储字符串,并存储自定义对象-该对象是使用XmlSerializer的base64编码的序列化XML-但是,这完全取决于您。唯一的建议是仅依赖CSS-不要使用外部文件来存储配置参数。 CSS是批处理类的组成部分-因此,当导出该类并将其导入不同的系统时,您的整个配置都将存在。

  

我需要考虑如何存储数据,因为有些用户有用户   个人资料

通常,您不必为此担心。 ValidateUser中的用户和密码属性是完全可选的-并且由于您打算编写无人值守的模块-理想情况下,Windows服务应在此处维护凭据。 Kofax和Windows将自动确保传递凭据,并且您的模块将在该用户的上下文下运行。只要确保用户对模块和所有关联的批处理类具有权限即可。如果您打算编写一个有人值守的模块,例如增强的Validation模块,则有所不同。