1

我想创建一个自定义模块,通过获取包含来自索引字段、批处理字段等的一些字段值的生成文件名字符串来重命名生成的 PDF 文件。

因此,当涉及到批处理时,我可以这样做(setupTransformator包含自定义存储字符串中的解析值)

    public void ProcessBatch(IBatch batch)
    {
        IACDataElement batchElement = GetBatchElementFromBatch(batch);
        IACDataElementCollection currentDocuments = GetDocumentsFromBatchElement(batchElement);
        IACDataElement customStorageStrings = GetCustomStorageStringsFromBatch(batch);
        IACDataElementCollection batchFields = GetElementsByName(batchElement, ResourcesKofax.BATCH_FIELDS, ResourcesKofax.BATCH_FIELD);

        setupTransformator = new SetupTransformator(customStorageStrings);

        for (int i = 0; i < currentDocuments.Count; i++)
        {
            int currentDocumentIndex = i + 1;
            IACDataElement currentDocument = currentDocuments[currentDocumentIndex];
            IACDataElementCollection indexFields = GetElementsByName(currentDocument, ResourcesKofax.INDEX_FIELDS, ResourcesKofax.INDEX_FIELD);

            string targetFilename = setupTransformator.GetFilename(batchElement, currentDocument, batchFields, indexFields);

            string documentFilePath = currentDocument[ResourcesKofax.PDF_GENERATION_FILE_NAME];

            // rename the PDF file
        }

        batch.BatchClose(KfxDbState.KfxDbBatchReady, KfxDbQueue.KfxDbQueueNext, 0, string.Empty);
    }

    private IACDataElement GetBatchElementFromBatch(IBatch batch)
    {
        IACDataElement rootElement = batch.ExtractRuntimeACDataElement(0);
        return rootElement.FindChildElementByName(ResourcesKofax.BATCH);
    }

    private IACDataElementCollection GetDocumentsFromBatchElement(IACDataElement batchElement)
    {
        return GetElementsByName(batchElement, ResourcesKofax.DOCUMENTS, ResourcesKofax.DOCUMENT);
    }

    private IACDataElement GetCustomStorageStringsFromBatch(IBatch batch)
    {
        IACDataElement setupElement = batch.ExtractSetupACDataElement(0);
        IACDataElementCollection batchClasses = GetElementsByName(setupElement, ResourcesKofax.BATCH_CLASSES, ResourcesKofax.BATCH_CLASS);
        IACDataElement batchClass = batchClasses[1];
        return batchClass.FindChildElementByName(ResourcesKofax.BATCH_CLASS_CUSTOM_STORAGE_STRINGS);
    }

    private IACDataElementCollection GetElementsByName(IACDataElement dataElement, string rootName, string targetName)
    {
        return dataElement.FindChildElementByName(rootName).FindChildElementsByName(targetName);
    }

我必须使用该File.Move方法还是可以使用 Kofax 库中的方法?

4

2 回答 2

2

文件名应仅由导出连接器处理。只要批次在系统中,就不应更改其名称,因为这可能导致数据丢失和损坏。

这尤其适用于使用 PDF 名称的字段值 - 因为只要批次在系统中,值就会发生变化,您将如何适应这种情况?没有什么可以阻止您的用户在您的自定义模块中处理批次并将批次设置回验证并更改一个或多个字段。

说到导出连接器及其 API:

默认情况下,Kofax 提供了两种导出 PDF 的方法 - 都在ReleaseData对象上(取自 API 文档):

  • CopyKofaxPDFFile:将属于文档的 PDF 文件复制到导出设置期间定义的导出 PDF 路径中。
  • CopyKofaxPDFFileToPath: 将属于某个文档的 PDF 文件复制到指定的路径中(该路径是该方法的字符串输入参数)。

这两种方法都使用了您可以在安装期间定义的内容 - 例如,CopyKofaxPDFFile使用KofaxPDFPath属性。我不确定是否有为文件名保留的属性。

我通常在运行时坚持KofaxPDFProperty暴露并执行File.Copy操作。我不建议移动文件或删除它,因为这是 KC 在成功导出批次后自动处理的事情(理论上,可能会有另一个导出,或者导出可能会失败)。

使用该ReleaseData对象访问字段值,并使用字符串插值来定义 PDF 的最终名称。

于 2019-06-26T19:04:38.230 回答
1

Wolfgang Radls 的回答是正确的。由于我必须使用自定义模块来解决项目,我的解决方案如下:

必须存在一个名为“文件名”的索引字段。在处理当前文档时,我可以用新的文件名填充这个索引字段。

    private void SetTargetFilename(IACDataElement batchElement, IACDataElement currentDocument, IACDataElementCollection batchFields, IACDataElementCollection indexFields)
    {
        // Get the file name from the custom storage strings
        string targetFilename = setupTransformator.GetFilename(batchElement, currentDocument, batchFields, indexFields);

        try
        {
            foreach (IACDataElement field in indexFields)
            {
                // ResourcesKofax.FIELD_NAME stands for "Name"
                // ResourcesKofax.FIELD_VALUE stands for "Value"
                // ResourcesKofax.INDEX_FIELD_FILENAME stands for "Filename"
                if (field[ResourcesKofax.FIELD_NAME] == ResourcesCommon.INDEX_FIELD_FILENAME)
                {
                    field[ResourcesKofax.FIELD_VALUE] = targetFilename;
                }
            }
        }
        catch (Exception exception)
        {
            throw exception;
        }
    }

现在,导出连接器能够从索引字段中读取新文件名。

于 2019-06-27T08:07:35.947 回答