- О программе ABBYY FlexiCapture
- Архитектура комплекса ABBYY FlexiCapture
-
Использование скриптов в ABBYY FlexiCapture
- Особенности .Net скриптов
- Подключение внешней сборки
- Редактор кода скрипта
- Объектная модель
-
Использование скриптов для настройки этапов обработки
-
Типы скриптов
- Скрипт правила
- Скрипт автозамены
- Скрипт экспорта
- Пользовательский скрипт
- Скрипт сборки документа
- Скрипт пользовательского распознавания
- Скрипт маршрутизации
- Скрипты обработки
- Скрипт обновления набора данных
- Скрипт валидации набора данных
- Скрипт классификации документа
-
Обработчики событий
- Создание пакета
- Удаление пакета
- Изменение свойств пакета
- Изменение состава пакета
- Перемещение страниц
- Открытие/закрытие пакета
- Проверка целостности пакета
- Изменение свойства документа
- Изменение состояния документа
- Скрипт после экспорта
- Скрипт после проверки правил
- Перед наложением определений документов
- Запрос на верификацию поля
-
Объекты
- IActionResult
- IAssemblingError
- IAssemblingErrors
- IBatch
- IBatchCheckResults
- IBatchItem
- IBatchItems
- IBatchTypeClassifier
- IBatchTypeClassifierResult
- IBinarizationParams
- IBoxedBoolean
- ICharacterParams
- ICharactersParams
- ICheckmarkGroupValue
- ICheckmarkValue
- IDataSet
- IDataSetQuery
- IDataSetRecord
- IDocument
- IDocuments
- IDocumentExportResults
- IDocumentsExportResults
- IDocumentDefinitionInfo
- IDocumentDefinitionInfoArray
- IEditablePictureObject
- IExportFieldsToRedact
- IExportImageSavingOptions
- IField
- IFieldRegion
- IFieldRegions
- IFields
- IFlexiCaptureTools
- ILocalContrastParams
- IMatchedSectionInfo
- IMatchingInfo
- IPage
- IPageClassificationResult
- IPages
- IPictureObject
- IPictureObjectsInfo
- IPrincipal
- IPrincipals
- IProcessingCallback
- IProject
- IProperties
- IProperty
- IPropertyModificationInfo
- IRecordCheckResult
- IRecordset
- IRect
- IRects
- IRoutingRuleResult
- IRuleContext
- IRuleError
- IRuleErrors
- IRuleTag
- IRuleTags
- IScriptBinaryAttributes
- IScriptDefinitionContext
- ISectionDefinitionInfo
- ISectionDefinitionInfoArray
- IShadowsHighlightsParams
- IStageInfo
- IUserAttachment
- IUserAttachments
- IUserSessionInfo
- IValue
- IVARIANTArray
- TAssemlingErrorType
- TBatchItemType
- TColorToFilter
- TExportFieldType
- TExportType
- TImageCompressionType
- TPageClassificationType
- TPdfAVersion
- TPdfDocumentInfoType
- TPdfTextSearchAreaType
- TPrincipalType
- TProcessingPriority
- TPropertyType
- TRuleErrorType
- TStateType
- Примеры скриптов
- Внутренние имена языков распознавания
-
Типы скриптов
-
Использование скриптов для обработки событий интерфейса
-
События
- После закрытия документа
- После закрытия проекта
- При активации документа в окне задания
- При активации поля
- При возврате из задания
- При вызове пользовательской команды
- При деактивации поля
- При закрытии документа
- При закрытии задания
- При закрытии проекта
- При изменении региона
- При изменении режима окна задания
- При открытии документа
- При открытии окна задания
- При отмене задания
- При отображении региона
- При отправке задания на этап
- При подтверждении текстового поля
-
Объекты
- IBoolean
- IBoxedFieldControl
- IDocumentEditor
- IDocumentItem
- IDocumentItems
- IDocumentsCollection
- IDocumentsWindow
- IDrawContext
- IErrorControl
- IErrorControls
- IErrorsWindow
- IFieldControl
- IFieldRegionControl
- IFieldRegionControls
- IFormWindow
- IImageWindow
- IMainMenu
- IMainWindow
- IMenu
- IMenuItem
- IPageControl
- IPageItem
- IPageItems
- IPagesCollection
- IPoint
- ISelection
- IShellRational
- IShellRect
- IShellRects
- ITaskWindow
- ITextEditor
- IToolbar
- IToolbarButton
- IToolbars
- TCommandBarType
- TCommandID
- TDockingType
- TDocumentState
- TErrorType
- TSelectionType
- TTaskWindowMode
- TTextSize
- TUserRole
- TWorkWindowType
-
События
- Пользовательский скрипт для веб-станции верификации
-
Интерфейс программирования приложения (API)
- О Web Services API Сервера Приложений ABBYY FlexiCapture
- Использование Web Services API Сервера Приложений ABBYY FlexiCapture
-
Справочная информация о Web Services API Сервера Приложений ABBYY FlexiCapture
- Методы программного интерфейса
- Типы данных программного интерфейса
- Работа с файлами с помощью POST-запросов
- Web Services MobileAPI для мобильных клиентов
- Web Services для управления учетными записями пользователей
- Примеры использования программного интерфейса Сервера Приложений
- Встраивание ABBYY FlexiCapture в сторонние системы
- Дополнительная настройка и кастомизация веб-станций
- Пользовательские отчеты
-
Приложения
- Поддерживаемые языки распознавания
- Шрифты для корректного отображения символов
- Поддерживаемые типы текста
- Поддерживаемые типы штрих-кодов
- Поддерживаемые входные форматы
- Форматы файлов экспорта
- Формат отображения даты
- Алфавит, используемый в регулярных выражениях
- Защита определений документов и дополнительных модулей
- Глоссарий
- Патенты
- Технологии других компаний
- Техническая поддержка
- Лицензионный договор с конечным пользователем
Примеры скриптов для описания экспорта
Получение значения поля при экспорте
Код данного примера демонстрирует, каким образом можно получить значение определенного поля при экспорте. Это может потребоваться, например, чтобы использовать это значение для именования файлов экспорта изображений или данных. Если такого поля в документе не окажется, то при выполнении скрипта возникнет ошибка.
Структура экспортируемого документа:
Section 1 Field1 … Group1 Field2 … … FieldN Section 2 Field1 … FieldK [JScript] // Получить значение Field1 в Section 1 if( Field("Section 1\\Field1").Value != null ) { var field1Value = Field("Section 1\\Field1").Value; } // Получить значение Field2 из Group1 в Section 1 if( Field("Section 1\\Group1\\Field2").Value != null ) { var field2Value = Field("Section 1\\Group1\\Field2").Value; } // Получить значение Field1 в Section 1, если раздел имеет несколько экземпляров if( Field( "Section 1" ).Items != null ) { var i, j; for( i = 0; i < Field( "Section 1" ).Items.Count; i++ ) { var curPage = Field( "Section 1" ).Items.Item( i ); if( curPage.Children != null ) { for( j = 0; j < curPage.Children.Count; j++ ) { var curField = curPage.Children.Item( j ); if( curField.Name == "Field1" && curField.Value != null ) { var field1Value = curField.Value; break; } } } } } [/JScript] [VBScript] Dim field1Value, field2Value ' Получить значение Field1 в Section 1 if Not IsNull( me.Field( "Section 1\Field1" ).Value ) then field1Value = me.Field( "Section 1\Field1" ).Value end if ' Получить значение Field2 из Group1 в Section 1 if Not IsNull( me.FIELD( "Section 1\Group1\Field2" ).Value ) then field2Value = me.Field( "Section 1\Group1\Field2" ).Value end if ' Получить значение Field1 в Section 1, если раздел имеет несколько экземпляров if Not me.Field( "Section 1" ).Items Is Nothing then dim curPage for each curPage in me.Field( "Section 1" ).Items if Not curPage.Children Is Nothing then dim curField for each curField in curPage.Children if curField.Name = "Field1" And Not IsNull( curField.Value ) then field1Value = curField.Value exit for end if next end if next end if [/VBScript]
Экспорт изображений страниц
Код данного примера демонстрирует, каким образом можно проэкспортировать изображения всех страниц документа, используя нужный формат файла, цветовую схему и разрешение. Изображения сохраняются постранично, т.е. каждая страница в свой файл.
В примере файлы именуются "page1.tif", "page2.tif" и т.д. по количеству страниц документа. При необходимости можно задать любое другое имя файла. Например, можно сформировать имя файла, используя значение какого-либо поля документа.
[JScript] var fso = new ActiveXObject("Scripting.FileSystemObject"); var folderName = "d:\\ExportImages"; if( !fso.FolderExists( folderName ) ) { fso.CreateFolder( folderName ); } var imageOptions = FCTools.NewImageSavingOptions(); imageOptions.Format = "tif"; imageOptions.ColorType = "BlackAndWhite"; imageOptions.Resolution = 600; var i; for( i = 0; i < Pages.Count; i++ ) { // задаем желаемое имя и расширение файла в соответствии с выбранным форматом var fileName = fso.BuildPath( folderName, "page" + (i+1) + ".tif" ); Pages.Item(i).SaveAs( fileName, imageOptions ); } [/JScript] [VBScript] dim fso, folderName set fso = CreateObject("Scripting.FileSystemObject") folderName = "d:\ExportImages" if Not fso.FolderExists( folderName ) then fso.CreateFolder folderName end if dim imageOptions set imageOptions = FCTools.NewImageSavingOptions imageOptions.Format = "tif" imageOptions.ColorType = "BlackAndWhite" imageOptions.Resolution = 600 dim i for i = 0 to me.Pages.Count - 1 dim fileName ' задаем желаемое имя и расширение файла в соответствии с выбранным форматом fileName = fso.BuildPath( folderName, "page" & (i+1) & ".tif" ) me.Pages.Item(i).SaveAs fileName, imageOptions next [/VBScript]
Экспорт таблицы
Пример демонстрирует экспорт таблицы в текстовый файл формата TXT.
[JScript] var fso, txtFile, fileName; fso = new ActiveXObject("Scripting.FileSystemObject"); fileName = "d:\\TestExportTable1.txt"; txtFile = fso.CreateTextFile( fileName, true ); txtFile.WriteLine( "Table" ); var table, i, j; table = Field("Page 1\\Table"); var rows = table.Items; for( i = 0; i < rows.Count; i++ ) { txtFile.WriteLine( "RowNumber = " + ( i+1 ) ); var cells = rows.Item(i).Children; for( j = 0; j < cells.Count; j++ ) { txtFile.Write( cells.Item(j).Value + " " ); } txtFile.WriteBlankLines(1); } txtFile.Close(); [/JScript] [VBScript] dim fso, txtFile, fileName set fso = CreateObject("Scripting.FileSystemObject") fileName = "d:\TestExportTable.txt" set txtFile = fso.CreateTextFile( fileName, true ) txtFile.WriteLine "Table" dim table, row, cell, rowNumber set table = me.Field("Page 1\Table") rowNumber = 1 for each row in table.Items txtFile.WriteLine "RowNumber = " & rowNumber for each cell in row.Children txtFile.Write cell.Value & " " next txtFile.WriteBlankLines 1 rowNumber = rowNumber + 1 next txtFile.Close set txtFile = nothing set fso = nothing [/VBScript]
Экспорт документа с произвольным уровнем вложенности
Пример показывает, каким образом осуществить экспорт полей документа с произвольным уровнем вложенности, используя собственные функции из глобального модуля экспорта. Экспорт осуществляется в текстовый файл формата TXT. Для экспорта полей документа произвольной вложенности лучше воспользоваться внешней COM-компонентой (см. следующий пример).
Основной код экспорта
[JScript]
Export.ExportDocument( this, FCTools );
[/JScript]
[VBScript]
Export.ExportDocument me, FCTools
[/VBScript]
Код функций глобального модуля экспорта
[JScript] // Функция осуществляет экспорт документа - создает папку экспорта, // сохраняет в нее файлы изображений страниц и текстовый файл с полями // документа и информацией о документе function ExportDocument(docObj, exportImageTools) { var folderName var txtFile, fileName var fso fso = new ActiveXObject("Scripting.FileSystemObject"); // создание папки экспорта try { folderName = CreateExportFolder(docObj.DefinitionName, fso); } catch( e ) { docObj.Action.Succeeded = false; docObj.Action.ErrorMessage = "Ошибка создания папки экспорта: " + e.description; return;n; } // экспорт изображений try { ExportImages(docObj, exportImageTools, folderName, fso); } catch( e ) { docObj.Action.Succeeded = false; docObj.Action.ErrorMessage = "Ошибка экспорта изображений: " + e.description; return; } // создание текстового файла fileName = fso.BuildPath(folderName, "doc.txt"); txtFile = fso.CreateTextFile(fileName, true); // экспорт информации о документе ExportDocInfo( docObj, txtFile ); // экспорт полей txtFile.WriteLine( "Fields:" ); try { ExportFields( docObj.Children, txtFile, "" ); } catch( e ) { { docObj.Action.Succeeded = false; docObj.Action.ErrorMessage = "Ошибка экспорта данных: " + e.description; txtFile.Close(); return; } txtFile.Close(); txtFile = 0; fso = 0; } // Функция экспорта изображений. В случае ошибки при экспорте изображений // возвращает сообщение об этой ошибке, в противном случае - пустую строку function ExportImages( docObj, exportImageTools, exportFolder, fso ) { // задание опций экспорта var imageOptions = exportImageTools.NewImageSavingOptions(); imageOptions.Format = "bmp"; imageOptions.ColorType = "FullColor"; imageOptions.Resolution = 100; // постраничный экспорт var pages = docObj.Pages; var i for( i = 0; i < pages.Count; i++ ) { var fileName = fso.BuildPath( exportFolder, "page" + (i+1) + ".bmp" ); pages.Item(i).SaveAs( fileName, imageOptions ); } } // Процедура экспорта информации о документе function ExportDocInfo(docObj, txtFile) { txtFile.WriteLine( "Doc info:" ); txtFile.WriteLine("IsAssembled " + docObj.IsAssembled); txtFile.WriteLine("IsVerified " + docObj.IsVerified); txtFile.WriteLine("IsExported " + docObj.IsExported); txtFile.WriteLine("ProcessingErrors " + docObj.ProcessingErrors); txtFile.WriteLine("ProcessingWarnings " + docObj.ProcessingWarnings); txtFile.WriteLine("TotalSymbolsCount " + docObj.TotalSymbolsCount); txtFile.WriteLine("RecognizedSymbolsCount " + docObj.RecognizedSymbolsCount); txtFile.WriteLine("UncertainSymbolsCount " + docObj.UncertainSymbolsCount); txtFile.WriteLine(); } // Процедура экспорта полей из коллекции fields function ExportFields(fields, txtFile, indent) { var i for( i = 0; i < fields.Count; i++ ) { ExportField( fields.Item(i), txtFile, indent ); } } // Проверяет значение поля на null // Если значение поля невалидно, то при любом обращении к нему(даже при // проверке на null) может возникнуть исключение function IsNullFieldValue( field ) { try { return ( field.Value == null ); } catch( e ) { return true; } } // Процедура экспорта поля function ExportField(field, txtFile, indent) { // сохраняем имя поля txtFile.Write(indent + field.Name); // сохраняем значение поля, если оно доступно if( IsNullFieldValue( field ) ) { txtFile.WriteLine(); } else { txtFile.WriteLine(" " + field.Text); } } if( field.Children != null ) { // экспорт дочерних полей ExportFields( field.Children, txtFile, indent + " " ); } else if( field.Items != null ) { // экспорт экземпляров поля ExportFields( field.Items, txtFile, indent + " " ); } } // Функция создает папку экспорта и возвращает полный путь к ней function CreateExportFolder(definitionName, fso) { var docFolder, folderName // основная папка var exportFolder = "d:\\ScriptExport"; if( !fso.FolderExists(exportFolder) ) { fso.CreateFolder (exportFolder); } } // папка указанного определения документа docFolder = fso.BuildPath(exportFolder, definitionName); if( !fso.FolderExists(docFolder) ) { fso.CreateFolder(docFolder); } // папка экспортируемого документа var i = 1; folderName = fso.BuildPath(docFolder, i); while( fso.FolderExists(folderName) ) { i++; folderName = fso.BuildPath(docFolder, i); } fso.CreateFolder(folderName); return folderName; } [/JScript] [VBScript] ' Процедура осуществляет экспорт документа - создает папку экспорта, ' сохраняет в нее файлы изображений страниц и текстовый файл с полями ' документа и информацией о документе Sub ExportDocument(ByRef docObj, ByRef FCTools) Dim folderName Dim txtFile, fileName Dim fso On Error Resume Next set fso = CreateObject("Scripting.FileSystemObject") ' создание папки экспорта folderName = CreateExportFolder(docObj.DefinitionName, fso) if Err.Number <> 0 then docObj.Action.Succeeded = false docObj.Action.ErrorMessage = "Ошибка создания папки экспорта: " + Err.Description Err.Clear Exit Subub End if ' экспорт изображений ExportImages docObj, FCTools, folderName, fso if Err.Number <> 0 then docObj.Action.Succeeded = false docObj.Action.ErrorMessage = "Ошибка экспорта изображений: " + Err.Description Err.Clear Exit Sub End if ' создание текстового файла fileName = fso.BuildPath(folderName, "doc.txt") Set txtFile = fso.CreateTextFile(fileName, True) ' экспорт информации о документе ExportDocInfo docObj, txtFile ' экспорт полей txtFile.WriteLine "Fields:" ExportFields docObj.Children, txtFile, "" txtFile.Close if Err.Number <> 0 then docObj.Action.Succeeded = false docObj.Action.ErrorMessage = "Ошибка экспорта данных: " + Err.Description Err.Clear Exit Sub End if Set txtFile = Nothing Set fso = Nothing End Sub ' функция экспорта изображений Function ExportImages( ByRef docObj, ByRef FCTools, ByVal exportFolder, ByRef fso ) Dim pages, page, imageOptions Dim fileName, pageNum ' задание опций экспорта Set imageOptions = FCTools.NewImageSavingOptions imageOptions.Format = "bmp" imageOptions.ColorType = "FullColor" imageOptions.Resolution = 100 ' постраничный экспорт Set pages = docObj.Pages pageNum = 1 For Each page In pageses fileName = fso.BuildPath(exportFolder, "page" & pageNum & ".bmp") page.SaveAs fileName, imageOptions pageNum = pageNum + 1 Next End Function ' Процедура экспорта информации о документе Sub ExportDocInfo(ByRef docObj, ByRef txtFile) txtFile.WriteLine "Doc info:" txtFile.WriteLine ("DocumentId " & docObj.Id) txtFile.WriteLine ("IsAssembled " & docObj.IsAssembled) txtFile.WriteLine ("IsVerified " & docObj.IsVerified) txtFile.WriteLine ("IsExported " & docObj.IsExported) txtFile.WriteLine ("ProcessingErrors " & docObj.ProcessingErrors) txtFile.WriteLine ("ProcessingWarnings " & docObj.ProcessingWarnings) txtFile.WriteLine ("TotalSymbolsCount " & docObj.TotalSymbolsCount) txtFile.WriteLine ("RecognizedSymbolsCount " & docObj.RecognizedSymbolsCount) txtFile.WriteLine ("UncertainSymbolsCount " & docObj.UncertainSymbolsCount) txtFile.WriteLine End Sub ' Процедура экспорта полей из коллекции fields Sub ExportFields(ByRef fields, ByRef txtFile, ByVal indent) Dim curField For Each curField In fields ExportField curField, txtFile, indent Next End Sub ' Проверяет значение поля на null ' Если значение поля невалидно, то при любом обращении к нему(даже при ' проверке на null) может возникнуть исключение Function IsNullFieldValue( ByRef field ) on error resume next IsNullFieldValue = IsNull( field.Value ) if Err.Number <> 0 then IsNullFieldValue = True Err.Clear End if End Function ' Процедура экспорта поля Sub ExportField(ByRef field, ByRef txtFile, ByVal indent) ' сохраняем имя поля txtFile.Write (indent & field.Name) ' сохраняем значение поля, если оно доступно If IsNullFieldValue(field) Then txtFile.WriteLine Else txtFile.WriteLine (" " & field.Text) End If If Not field.Children Is Nothing Then ' экспорт дочерних полей ExportFields field.Children, txtFile, indent & " " ElseIf Not field.Items Is Nothing Then ' экспорт экземпляров поля ExportFields field.Items, txtFile, indent & " " End If End Sub ' Функция создает папку экспорта и возвращает полный путь к ней Function CreateExportFolder(ByVal definitionName, ByRef fso) Dim docFolder, folderName ' основная папка exportFolder = "d:\ScriptExport" If fso.FolderExists(exportFolder) = False Then fso.CreateFolder (exportFolder) End If ' папка указанного определения документа docFolder = fso.BuildPath(exportFolder, definitionName) If fso.FolderExists(docFolder) = False Then fso.CreateFolder (docFolder) End If ' папка экспортируемого документа Dim i i = 1 folderName = fso.BuildPath(docFolder, i) While fso.FolderExists(folderName) i = i + 1 folderName = fso.BuildPath(docFolder, i) Wend fso.CreateFolder (folderName) CreateExportFolder = folderName End Function [/VBScript]
Использование внешней COM-компоненты
[JScript] var autoExport = new ActiveXObject("AutomationExport.Exporter"); autoExport.Export( this, FCTools ); [/JScript] [VBScript] dim autoExport set autoExport = CreateObject( "AutomationExport.Exporter" ) autoExport.Export me, FCTools [/VBScript]
Код компонента ActiveX в VisualBasic
Ниже приведен код класса Exporter из проекта AutomationExport, который используется в вышеупомянутых сценариях.
OptionExplicit Dim mFso AsNew Scripting.FileSystemObject ' Процедура осуществляет экспорт документа - создает папку экспорта, ' сохраняет в нее файлы изображений страниц и текстовый файл с полями ' документа и информацией о документе PublicSub Export(ByRef docObj As Object, ByRef FCTools As Object) OnErrorGoTo err_h Dim folderName AsString Dim txtFile As TextStream, fileName AsString Dim imageExportResult AsString, errMessage AsString ' создание папки экспорта folderName = createExportFolder(docObj.definitionName) If folderName = "" Then docObj.Action.Succeeded = False docObj.Action.ErrorMessage = "Невозможно создать папку экспорта" ExitSub EndIf ' экспорт изображений imageExportResult = exportImages(docObj, FCTools, folderName) ' создание текстового файла fileName = mFso.BuildPath(folderName, "doc.txt") Set txtFile = mFso.CreateTextFile(fileName, True) ' сохранение информации о проблемах экспорта изображений If imageExportResult <> "" Then txtFile.WriteLine imageExportResult errMessage = errMessage & imageExportResult EndIf ' экспорт информации о документе exportDocInfo docObj, txtFile ' экспорт полей txtFile.WriteLine "Fields:" IfNot exportFields(docObj.Children, txtFile, "") Then errMessage = errMessage & " Ошибка экспорта данных" EndIf txtFile.Close ' при возникновении ошибок во время экспорта, смена флага ' успешности экспорта на значение False If errMessage <> "" Then docObj.Action.Succeeded = False docObj.Action.ErrorMessage = errMessage EndIf Set txtFile = Nothing Set mFso = Nothing ExitSub err_h: docObj.Action.Succeeded = False docObj.Action.ErrorMessage = Err.Description txtFile.Close Set mFso = Nothing EndSub ' Функция экспорта изображений. При возникновении ошибки во время экспорта, ' возвращает сообщение об ошибке, в противном случае возвращает пустую строку PrivateFunction exportImages(ByRef docObj As Object, ByRef FCTools As Object, _ ByVal exportFolder AsString) AsString OnErrorGoTo err_h Dim pages As Object, page As Object, imageOptions As Object Dim fileName AsString, pageNum AsLong exportImages = "" ' задание опций экспорта Set imageOptions = FCTools.NewImageSavingOptions imageOptions.Format = "png" imageOptions.ColorType = "GrayScale" imageOptions.Resolution = 300 ' постраничный экспорт Set pages = docObj.pages pageNum = 1 ForEach page In pages fileName = mFso.BuildPath(exportFolder, page.definitionName + "_page" & pageNum & "." & imageOptions.Format) page.SaveAs fileName, imageOptions pageNum = pageNum + 1 Next page ExitFunction err_h: exportImages = Err.Description EndFunction ' Процедура экспорта информации о документе PrivateSub exportDocInfo(ByRef docObj As Object, ByRef txtFile As TextStream) OnErrorGoTo err_h txtFile.WriteLine "Doc info:" txtFile.WriteLine ("DocumentId " & docObj.Id) txtFile.WriteLine ("IsAssembled " & docObj.IsAssembled) txtFile.WriteLine ("IsVerified " & docObj.IsVerified) txtFile.WriteLine ("IsExported " & docObj.IsExported) txtFile.WriteLine ("ProcessingErrors " & docObj.ProcessingErrors) txtFile.WriteLine ("ProcessingWarnings " & docObj.ProcessingWarnings) txtFile.WriteLine ("TotalSymbolsCount " & docObj.TotalSymbolsCount) txtFile.WriteLine ("RecognizedSymbolsCount " & docObj.RecognizedSymbolsCount) txtFile.WriteLine ("UncertainSymbolsCount " & docObj.UncertainSymbolsCount) txtFile.WriteLine ExitSub err_h: txtFile.WriteLine Err.Description EndSub ' Процедура экспорта полей из коллекции fields PrivateFunction exportFields(ByRef fields As Object, ByRef txtFile As TextStream, ByVal indent As String) AsBoolean OnErrorGoTo err_h Dim curField As Object exportFields = True ForEach curField In fields IfNot exportField(curField, txtFile, indent) Then exportFields = False EndIf Next curField ExitFunction err_h: txtFile.WriteLine Err.Description exportFields = False EndFunction ' Проверяет значение поля на null ' Если значение поля невалидно, то при любом обращении к нему(даже при ' проверке на null) может возникнуть исключение Function IsNullFieldValue(ByRef field As Object) AsBoolean OnErrorGoTo err_h IsNullFieldValue = IsNull(field.Value) ExitFunction err_h: IsNullFieldValue = True EndFunction ' Функция экспорта поля PrivateFunction exportField(ByRef field As Object, ByRef txtFile As TextStream, _ ByVal indent AsString) AsBoolean OnErrorGoTo err_h Dim result AsBoolean result = True ' сохраняем имя поля txtFile.Write (indent & field.Name) ' сохраняем значение поля, если оно доступно IfNot IsNullFieldValue(field) Then txtFile.WriteLine (" " & field.Value) Else txtFile.WriteLine EndIf IfNot field.Children Is NothingThen ' экспорт дочерних полей result = result And exportFields(field.Children, txtFile, indent & " ") ElseIfNot field.Items IsNothingThen ' экспорт экземпляров поля result = result And exportFields(field.Items, txtFile, indent & " ") EndIf exportField = result ExitFunction err_h: txtFile.WriteLine Err.Description exportField = False EndFunction ' Функция создает папку экспорта и возвращает полный путь к ней PrivateFunction createExportFolder(ByVal definitionName AsString) AsString OnErrorGoTo err_h Dim docFolder AsString, folderName AsString ' основная папка Const exportFolder = "d:\AutomationExport" If mFso.FolderExists(exportFolder) = FalseThen mFso.CreateFolder (exportFolder) EndIf ' папка указанного определения документа docFolder = mFso.BuildPath(exportFolder, definitionName) If mFso.FolderExists(docFolder) = FalseThen mFso.CreateFolder (docFolder) EndIf ' папка экспортируемого документа Dim i AsLong i = 1 folderName = mFso.BuildPath(docFolder, i) While mFso.FolderExists(folderName) i = i + 1 folderName = mFso.BuildPath(docFolder, i) Wend mFso.CreateFolder (folderName) createExportFolder = folderName ExitFunction err_h: createExportFolder = "" EndFunction
Использование внешнего компонента, написанного на .Net( C# )
Чтобы использовать внешний компонент, написанный на .Net, сделайте следующее:
- Создайте проект типа ClassLibrary
- Добавьте ControllerInterop.dll в список ссылок проекта. ABBYY FlexiCapture появится в списке ссылок, и все интерфейсы объектов сценария станут доступны в проекте.
- Определите интерфейс disp и класс, который реализует этот интерфейс, а также ProgId (это позволит работать с компонентом .Net так же, как с ActiveX из кода скрипта).
- После создания проекта зарегистрируйте созданную библиотеку типов (это можно сделать автоматически, включив соответствующую опцию в свойствах проекта)
- Из кода экспорта вызовите метод компонента обычным способом:
[VBScript] dim autoExport set autoExport = CreateObject( "ExportLibrary1.Export" ) autoExport.ExportDocument me, FCTools [JScript] var autoExport = new ActiveXObject("ExportLibrary1.Export"); autoExport.ExportDocument( this, FCTools );
Ниже приведен код такого компонента:
using System; using System.Runtime.InteropServices; using System.IO; using ABBYY.FlexiCapture; namespace ExportLibrary1 { // Интерфейс компонента экспорта, доступный из скрипта // При создании нового компонента генерирует новый GUID [Guid("32B10C3B-EEA3-4194-B0A0-E358C310225A")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface _cExport { [DispId(1)] void ExportDocument(ref IExportDocument DocRef, ref FCTools Tools); } // Класс реализует функциональность компонента экспорта // При создании нового компонента генерирует новый GUID // и устанавливает ваш ProgId [Guid("3BA19BD7-C6DC-4f63-BC08-0D95254DADC3")] [ClassInterface(ClassInterfaceType.None)] [ProgId("ExportLibrary1.Export")] [ComVisible(true)] public class Export : _cExport { public Export() { } // Функция осуществляет экспорт документов: создаёт папку экспорта и // сохраняет в ней файлы изображений страницы, // текстовый файл с полями документа и информацией о документе public void ExportDocument( ref IExportDocument docRef, ref FCTools FCTools ) { try { string exportFolder = createExportFolder( docRef.DefinitionName ); exportImages( docRef, FCTools, exportFolder ); // создание текстового файла string fileName = exportFolder + "//" + "doc.txt"; StreamWriter sw = File.CreateText( fileName ); // экспорт информации о документе exportDocInfo( docRef, sw ); // экспорт полей sw.WriteLine( "Fields:" ); exportFields( docRef.Children, sw, "" ); sw.Close(); } catch( Exception e ) { docRef.Action.Succeeded = false; docRef.Action.ErrorMessage = e.ToString(); } } // Функция создает папку экспорта и возвращает полный путь к ней privatestring createExportFolder(string definitionName ) { string docFolder, folderName; // основная папка string exportFolder = "d:\\DotNetExport"; if( !Directory.Exists(exportFolder) ) { Directory.CreateDirectory(exportFolder); } // папка указанного определения документа docFolder = exportFolder + "\\" + definitionName; if( !Directory.Exists(docFolder) ) { Directory.CreateDirectory( docFolder ); } // папка экспортируемого документа int i = 1; folderName = docFolder + "\\" + i; while( Directory.Exists(folderName) ) { i++; folderName = docFolder + "\\" + i; } Directory.CreateDirectory(folderName); return folderName; } // Функция экспорта изображений private void exportImages( IExportDocument docRef, FCTools FCTools, string exportFolder ) { string baseFileName = exportFolder + "\\page_"; IExportImageSavingOptions imageOptions = FCTools.NewImageSavingOptions(); imageOptions.Format = "bmp"; imageOptions.ColorType = "FullColor"; imageOptions.Resolution = 100; int i = 1; foreach( IExportPage curPage in docRef.Pages ) { string fileName = baseFileName + i + ".bmp"; curPage.SaveAs( fileName, imageOptions ); i++; } } // Экспорт информации о документе private void exportDocInfo( IExportDocument docRef, StreamWriter sw ) { sw.WriteLine( "Doc info:" ); sw.WriteLine("DocumentId " + docRef.Id ); sw.WriteLine("IsAssembled " + docRef.IsAssembled); sw.WriteLine("IsVerified " + docRef.IsVerified); sw.WriteLine("IsExported " + docRef.IsExported); sw.WriteLine("ProcessingErrors " + docRef.ProcessingErrors); sw.WriteLine("ProcessingWarnings " + docRef.ProcessingWarnings); sw.WriteLine("TotalSymbolsCount " + docRef.TotalSymbolsCount); sw.WriteLine("RecognizedSymbolsCount " + docRef.RecognizedSymbolsCount); sw.WriteLine("UncertainSymbolsCount " + docRef.UncertainSymbolsCount); sw.WriteLine(); } // Экспорт коллекции полей private void exportFields( IExportFields fields, StreamWriter sw, string indent ) { foreach( IExportField curField in fields ) { exportField( curField, sw, indent ); } } // Проверяет значение поля на null // Если значение поля невалидно, то при любом обращении к нему(даже при // проверке на null) может возникнуть исключение privatebool IsNullFieldValue( IExportField field ) { try { return ( field.Value == null ); } catch( Exception e ) { returntrue; } } // экспорт указанного поля private void exportField( IExportField field, StreamWriter sw, string indent ) { // сохраняем имя поля sw.Write( indent + field.Name ); // сохраняем значение поля, если оно доступно if( IsNullFieldValue( field ) ) { sw.WriteLine(); } else { sw.WriteLine( " " + field.Text ); } if( field.Children != null ) { // экспорт дочерних полей exportFields( field.Children, sw, indent + " " ); } else if( field.Items != null ) { // экспорт экземпляров поля exportFields( field.Items, sw, indent + " " ); } } } }
Обработчик экспорта
Код данного примера демонстрирует простейший обработчик экспорта, который сохраняет информацию о проэкспортированных документах и результатах экспорта в текстовые файлы. В примере использованы два текстовых файла – со списком успешно проэкспортированных документов и документов, при экспорте которых, возникли ошибки.
[JScript] var fso = new ActiveXObject("Scripting.FileSystemObject"); // создание файла со списком ошибочных документов var fileErrorName = "d:\\ExportResults\\ErrorsDocuments.txt"; var txtErrorFile = fso.CreateTextFile( fileErrorName, true ); // создание файла со списком успешно проэкпортированных документов var fileSucceedName = "d:\\ExportResults\\SucceedDocuments.txt" var txtSucceedFile = fso.CreateTextFile( fileSucceedName, true ); var i // проитерируем коллекцию экспортированных документов for( i = 0; i < Documents.Count; i++ ) { var curDoc = Documents.Item( i ); var docInfo = "DocumentId: " + curDoc.Id; if( curDoc.Action.Succeeded ) { docInfo = docInfo + ". Экспортировано успешно. Результат:" + curDoc.Action.Result; txtSucceedFile.WriteLine( docInfo ); } else { docInfo = docInfo + ". Ошибка экспорта: " + curDoc.Action.ErrorMessage + " Результат:" + curDoc.Action.Result; txtErrorFile.WriteLine( docInfo ); } } txtErrorFile.Close(); txtSucceedFile.Close(); [/JScript] [VBScript] dim curDoc dim fso, fileErrorName, txtErrorFile, fileSucceedName, txtSucceedFile set fso = CreateObject("Scripting.FileSystemObject") ' создание файла со списком ошибочных документов fileErrorName = "d:\ExportResults\ErrorsDocuments.txt" set txtErrorFile = fso.CreateTextFile( fileErrorName, true ) ' создание файла со списком успешно проэкпортированных документов fileSucceedName = "d:\ExportResults\SucceedDocuments.txt" set txtSucceedFile = fso.CreateTextFile( fileSucceedName, true ) dim i, exprortResult, docInfo ' проитерируем коллекцию экспортированных документов for i = 0 Tome.Count - 1 set exportResult = me.Item(i) docInfo = "DocumentId:" & exportResult.Document.Id if exportResult.Succeeded then docInfo = docInfo & " - Экспортировано успешно." txtSucceedFile.WriteLine docInfo else docInfo = docInfo & " - Ошибка экспорта: " & exportResult.ErrorMessage txtErrorFile.WriteLine docInfo endif next txtErrorFile.Close txtSucceedFile.Close [/VBScript]
Доступ к исходным файлам офисных форматов
Данный пример скрипта показывает, как сохранять исходные файлы офисных форматов при экспорте документов. Во избежание конфликта при сохранении, файл должен содержать уникальное имя.
[C# .Net] using System; using System.IO; using System.Collections.Generic; // Обходим страницы. for( int i = 0; i<Document.Pages.Count; i++ ) { IPage page = Document.Pages[i]; // Проверяем наличие исходного файла. if( page.SourceFileGUID == "" ) { continue; } // Исходное имя файла. string sourceFileName = @""; // Заполняем исходное имя файла. if( page.ImageSourceType == @"File" ) { sourceFileName = Path.GetFileName( page.ImageSource ); } else if( page.ImageSourceType == @"Scanner" || page.ImageSourceType == @"Custom" ) { sourceFileName = Path.GetFileName( page.ImageSourceFileSubPath ); } // Убираем расширение из имени файла. if( sourceFileName != @"" ) { sourceFileName = Path.GetFileNameWithoutExtension( sourceFileName ) + @"."; } // Уникальное имя исходного файла (исходное имя + guid). string sourceFileUniqueName = sourceFileName + page.SourceFileGUID; // Путь для сохранения исходного файла. string sourceFilePath = Document.Batch.Project.ExportRootPath + @"\" + sourceFileUniqueName; // Проверяем, что этот файл ещё не сохраняли. if( File.Exists( sourceFilePath ) ) { continue; } // Сохраняем файл. Processing.ReportMessage( "Сохранение исходного файла: " + sourceFileUniqueName ); page.SaveSourceFile( sourceFilePath ); } [/C# .Net]
13.04.2021 11:12:44