diff --git a/android/src/main/java/com/pspdfkit/flutter/pspdfkit/FlutterPdfUiFragment.kt b/android/src/main/java/com/pspdfkit/flutter/pspdfkit/FlutterPdfUiFragment.kt index 0a28f9e3..52c7d892 100644 --- a/android/src/main/java/com/pspdfkit/flutter/pspdfkit/FlutterPdfUiFragment.kt +++ b/android/src/main/java/com/pspdfkit/flutter/pspdfkit/FlutterPdfUiFragment.kt @@ -17,6 +17,7 @@ package com.pspdfkit.flutter.pspdfkit /// This notice may not be removed from this file. /// import com.pspdfkit.document.PdfDocument +import com.pspdfkit.flutter.pspdfkit.util.FormFieldMigrationHelper import com.pspdfkit.ui.PdfUiFragment class FlutterPdfUiFragment : PdfUiFragment() { @@ -25,5 +26,6 @@ class FlutterPdfUiFragment : PdfUiFragment() { super.onDocumentLoaded(document) // Notify the Flutter PSPDFKit plugin that the document has been loaded. EventDispatcher.getInstance().notifyDocumentLoaded(document) + FormFieldMigrationHelper.migrateFieldFormatActions(document) } } \ No newline at end of file diff --git a/android/src/main/java/com/pspdfkit/flutter/pspdfkit/util/FormFieldMigrationHelper.kt b/android/src/main/java/com/pspdfkit/flutter/pspdfkit/util/FormFieldMigrationHelper.kt new file mode 100644 index 00000000..0260c524 --- /dev/null +++ b/android/src/main/java/com/pspdfkit/flutter/pspdfkit/util/FormFieldMigrationHelper.kt @@ -0,0 +1,61 @@ +/* + * Copyright © 2025 PSPDFKit GmbH. All rights reserved. + * + * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW + * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT. + * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES. + * This notice may not be removed from this file. + */ + +package com.pspdfkit.flutter.pspdfkit.util + +import com.pspdfkit.annotations.actions.AnnotationTriggerEvent +import com.pspdfkit.annotations.actions.JavaScriptAction +import com.pspdfkit.document.PdfDocument +import com.pspdfkit.forms.FormElement +import com.pspdfkit.forms.FormType +import com.pspdfkit.forms.TextInputFormat + +object FormFieldMigrationHelper { + @JvmStatic + fun migrateFieldFormatActions(document: PdfDocument): Boolean { + var changed = false + document.formProvider.formElements.forEach { element -> + if (element.type == FormType.TEXT) { + changed = migrateFieldFormatActions(element) or changed + } + } + return changed + } + + private fun migrateFieldFormatActions(element: FormElement): Boolean { + if (element.getInputFormat() in listOf(TextInputFormat.DATE, TextInputFormat.TIME)) return false + + element.getJavaScriptActionForEvent(AnnotationTriggerEvent.FIELD_FORMAT)?.let { action -> + if (action.startsWith("AFTime") || action.startsWith("AFDate")) { + action.replace("_Format", "_Keystroke").also { fixedFormat -> + element.annotation.setAdditionalAction(AnnotationTriggerEvent.FORM_CHANGED, JavaScriptAction(fixedFormat)) + return true + } + } + } + return false + } + + private fun FormElement.getInputFormat(): TextInputFormat { + val formatString = getJavaScriptActionForEvent(AnnotationTriggerEvent.FORM_CHANGED) + ?: return TextInputFormat.NORMAL + + return when { + formatString.startsWith("AFDate_Keystroke") + -> TextInputFormat.DATE + formatString.startsWith("AFTime_Keystroke") + -> TextInputFormat.TIME + else -> TextInputFormat.NORMAL + } + } + + private fun FormElement.getJavaScriptActionForEvent(event: AnnotationTriggerEvent): String? = + (annotation.getAdditionalAction(event) as? JavaScriptAction + ?: formField.getAdditionalAction(event) as? JavaScriptAction)?.script +} \ No newline at end of file diff --git a/example/PDFs/formdoc.pdf b/example/PDFs/formdoc.pdf new file mode 100644 index 00000000..3e0bd183 Binary files /dev/null and b/example/PDFs/formdoc.pdf differ diff --git a/example/lib/examples.dart b/example/lib/examples.dart index b8fd5188..587f2b56 100644 --- a/example/lib/examples.dart +++ b/example/lib/examples.dart @@ -45,7 +45,7 @@ const String _documentPath = 'PDFs/PSPDFKit.pdf'; const String _measurementsDocs = 'PDFs/Measurements.pdf'; const String _lockedDocumentPath = 'PDFs/protected.pdf'; const String _imagePath = 'PDFs/PSPDFKit_Image_Example.jpg'; -const String _formPath = 'PDFs/Form_example.pdf'; +const String _formPath = 'PDFs/formdoc.pdf'; const String _instantDocumentJsonPath = 'PDFs/Instant/instant-document.json'; const String _xfdfPath = 'PDFs/Instant/document.xfdf'; const String _processedDocumentPath = 'PDFs/Embedded/PSPDFKit-processed.pdf';