从ReleaseData.Values获取值

时间:2019-01-16 08:32:45

标签: kofax

在执行发布脚本的OpenScript方法时,我想将索引字段,批处理字段和变量存储到列表中。我为此创建了一个代码段

Dictionary<string, string> indexFields = new Dictionary<string, string>();
Dictionary<string, string> batchFields = new Dictionary<string, string>();
Dictionary<string, string> kofaxValues = new Dictionary<string, string>();

foreach (Value val in documentData.Values)
{
    if (val.TableName.IsEmpty())
    {
        string sourceName = val.SourceName;
        string sourceValue = val.Value;

        switch (val.SourceType)
        {
            case KfxLinkSourceType.KFX_REL_INDEXFIELD:
                indexFields.Add(sourceName, sourceValue);
                break;

            case KfxLinkSourceType.KFX_REL_VARIABLE:
                kofaxValues.Add(sourceName, sourceValue);
                break;

            case KfxLinkSourceType.KFX_REL_BATCHFIELD:
                batchFields.Add(sourceName, sourceValue);
                break;
        }
    }
}

我想这样做,因为我需要字段值。每个字段名称都是唯一的,因此我可以将其用作键。

将自定义属性存储到ReleaseSetupData时,我可以从ReleaseData中读取它们。假设有两个自定义属性会返回字段名称和字段类型,所以我知道该字段是IndexField,名称是“ MyIndexField”。

我可以使用这些信息来访问Dictionary<string, string> indexFields并从Indexfield获取值。

目前,我使用此代码设置了ReleaseSetupData

releaseSetupData.CustomProperties.RemoveAll();

// Save all custom properties here

releaseSetupData.CustomProperties.Add("myCustomProperty", "fooBar");

releaseSetupData.Links.RemoveAll();

foreach (IndexField indexField in releaseSetupData.IndexFields) // Save all IndexFields
{
    releaseSetupData.Links.Add(indexField.Name, KfxLinkSourceType.KFX_REL_INDEXFIELD, indexField.Name);
}

foreach (BatchField batchField in releaseSetupData.BatchFields) // Save all BatchFields
{
    releaseSetupData.Links.Add(batchField.Name, KfxLinkSourceType.KFX_REL_BATCHFIELD, batchField.Name);
}

foreach (dynamic batchVariable in releaseSetupData.BatchVariableNames) // Save all Variables
{
    releaseSetupData.Links.Add(batchVariable, KfxLinkSourceType.KFX_REL_VARIABLE, batchVariable);
}

当我的发布脚本的OpenScript方法被执行时,字典(如第一个代码片段所示)保持为空。这是因为documentData.Values为空。

如何填写documentData.Values

1 个答案:

答案 0 :(得分:3)

不能。事件的顺序如下:

  1. OpenScript()被调用-每批一次。
  2. ReleaseDoc()被调用-每个文档一次
  3. CloseScript()被调用-每批一次。

“值”集合保存特定于单个文档的信息,因此在OpenScript()期间将为空。有时这不是您想要的-您可能想访问另一个文档的值,或一次导出所有这些值-例如在一个Web服务调用中。

这是我推荐的:

为Kofax的Document对象创建包装器类。这是我的方法(仅显示属性)。此类具有一个接受ReleaseData对象作为单个参数的构造函数,并且所有相应的属性都填充在该构造函数中。

public class Document
  {
      public Dictionary<string, string> BatchFields { get; private set; }
      public Dictionary<string, string> IndexFields { get; private set; }
      public Dictionary<string,string> KofaxValues { get; set; }
      public Dictionary<string, string> TextConstants { get; set; }
      public Dictionary<string, string> CustomProperties { get; private set; }
      public Dictionary<string,string> ConfigurationSettings { get; set; }
      public List<Table> Tables { get; private set; }
      private List<Column> Columns;
      public List<string> ImageFileNames { get; private set; }
      public string KofaxPDFFileName { get; private set; }
      public string XdcFilePath { get; private set; }
      public XDocument XDocument { get; private set; }
      public string ImageFilePath { get; private set; }
      public string KofaxPDFPath { get; private set; }
      public string TextFilePath { get; private set; }
      public byte[] BinaryImage { get; private set; }
      public char CellSeparator { get; set; }
}

然后,在ReleaseDoc()期间,我将所有Documents添加到集合中。请注意,连接documents在您的ReleaseScript中定义为私有:

public KfxReturnValue ReleaseDoc()
{
  documents.Add(new Document(DocumentData));
}

然后您可以决定何时以及在何处导出数据。也可能在CloseScript()事件期间,但是请记住,必须在ReleaseDoc()期间抛出健全性检查和与文档数据相关的潜在异常(无效的索引字段值等)。使用自定义包装器类和集合可为您的导出连接器(如LINQ)增加.NET固有的很多灵活性和功能-这是一个示例(对于Kofax的COM对象是不可能的):

var noPdfs = documents.Where(x => x.KofaxPDFPath.Length == 0);