Переименовать файл PDF - PullRequest
1 голос
/ 26 июня 2019

Я хотел бы создать пользовательский модуль, который переименовывает сгенерированные файлы 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, который я могу использовать?

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Имена файлов должны обрабатываться только соединителями экспорта. Пока пакет находится в системе, его имена не должны изменяться, так как это может привести к потере данных и повреждению.

Это особенно относится к использованию значений полей для имени PDF - поскольку значения могут изменяться, пока пакет находится в системе, как бы вы это приспособили? Ничто не мешает вашим пользователям обработать пакет в вашем пользовательском модуле и вернуть пакет обратно в проверку и изменить одно или несколько полей.

Говоря о коннекторе экспорта и его API:

По умолчанию Kofax предлагает два метода экспорта PDF - оба для объекта ReleaseData (это взято из документации API):

  • CopyKofaxPDFFile: скопируйте файл PDF, принадлежащий документу, в путь экспорта PDF, заданный при настройке экспорта.
  • CopyKofaxPDFFileToPath: скопировать файл PDF, принадлежащий документу, по указанному пути (путь является строковым аргументом ввода для этого метода).

Оба метода используют то, что может определить во время установки - например, CopyKofaxPDFFile использует свойство KofaxPDFPath. Я не уверен, есть ли свойство, зарезервированное для имени файла.

Я обычно придерживаюсь KofaxPDFProperty, выставленного во время выполнения, и выполняю File.Copy операцию. Я бы не рекомендовал перемещать файл или удалять его, так как это то, что KC автоматически обрабатывает после успешного экспорта пакета (теоретически это может быть другой экспорт или экспорт может просто потерпеть неудачу).

Используйте объект ReleaseData для доступа к значениям поля и интерполяции строк для определения окончательного имени PDF.

1 голос
/ 27 июня 2019

Вольфганг Радлс ответ правильный. В связи с тем, что я должен решить проект с помощью специального модуля, мое решение следующее:

Должно существовать поле индекса под названием «Имя файла». При обработке текущего документа я могу заполнить это поле индекса новым именем файла.

    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;
        }
    }

Теперь соединитель экспорта может читать новое имя файла из поля индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...