1

在执行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

4

1 回答 1

3

你不能。事件顺序如下:

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

Values 集合包含特定于单个文档的信息,因此在OpenScript(). 有时这不是您想要的——您可能想要访问另一个文档的值,或者一次将它们全部导出——例如在单个 Web 服务调用中。

以下是我的建议:

Document为 Kofax对象创建一个包装类。这是我的方法(仅显示属性)。此类具有接受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);
于 2019-01-16T16:46:49.933 回答