From bf73b5b1d1eea0fd36335af8b9fe8be59b933759 Mon Sep 17 00:00:00 2001 From: Christoph Schlaepfer <1939311+Anuril@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:24:37 +0200 Subject: [PATCH] Feature: OCR Templates (#13043) [skip ci] Signed-off-by: dependabot[bot] Co-Authored-By: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-Authored-By: stumpylog <797416+stumpylog@users.noreply.github.com> Co-Authored-By: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Co-Authored-By: shamoon <4887959+shamoon@users.noreply.github.com> --- src-ui/src/app/app-routing.module.ts | 26 + .../app-frame/app-frame.component.html | 8 + .../document-detail.component.html | 8 + .../document-detail.component.ts | 42 + .../bulk-editor/bulk-editor.component.html | 3 + .../bulk-editor/bulk-editor.component.ts | 31 +- .../ocr-template-editor.component.html | 414 ++++++++ .../ocr-template-editor.component.scss | 3 + .../ocr-template-editor.component.ts | 997 ++++++++++++++++++ .../ocr-templates.component.html | 75 ++ .../ocr-templates/ocr-templates.component.ts | 98 ++ src-ui/src/app/data/ocr-template.ts | 102 ++ .../src/app/services/permissions.service.ts | 1 + .../src/app/services/rest/document.service.ts | 8 + .../app/services/rest/ocr-template.service.ts | 47 + src-ui/src/main.ts | 6 + src/documents/apps.py | 13 + .../0022_ocrtemplate_ocrtemplatezone.py | 267 +++++ src/documents/models.py | 245 +++++ src/documents/serialisers.py | 129 +++ src/documents/signals/handlers.py | 69 ++ src/documents/tests/test_api_ocr_templates.py | 449 ++++++++ src/documents/tests/test_zone_ocr.py | 454 ++++++++ src/documents/views.py | 292 +++++ src/documents/zone_ocr.py | 757 +++++++++++++ src/paperless/urls.py | 2 + 26 files changed, 4545 insertions(+), 1 deletion(-) create mode 100644 src-ui/src/app/components/manage/ocr-templates/ocr-template-editor/ocr-template-editor.component.html create mode 100644 src-ui/src/app/components/manage/ocr-templates/ocr-template-editor/ocr-template-editor.component.scss create mode 100644 src-ui/src/app/components/manage/ocr-templates/ocr-template-editor/ocr-template-editor.component.ts create mode 100644 src-ui/src/app/components/manage/ocr-templates/ocr-templates.component.html create mode 100644 src-ui/src/app/components/manage/ocr-templates/ocr-templates.component.ts create mode 100644 src-ui/src/app/data/ocr-template.ts create mode 100644 src-ui/src/app/services/rest/ocr-template.service.ts create mode 100644 src/documents/migrations/0022_ocrtemplate_ocrtemplatezone.py create mode 100644 src/documents/tests/test_api_ocr_templates.py create mode 100644 src/documents/tests/test_zone_ocr.py create mode 100644 src/documents/zone_ocr.py diff --git a/src-ui/src/app/app-routing.module.ts b/src-ui/src/app/app-routing.module.ts index 66864a0d5..5afebd070 100644 --- a/src-ui/src/app/app-routing.module.ts +++ b/src-ui/src/app/app-routing.module.ts @@ -13,6 +13,8 @@ import { DocumentDetailComponent } from './components/document-detail/document-d import { DocumentListComponent } from './components/document-list/document-list.component' import { DocumentAttributesComponent } from './components/manage/document-attributes/document-attributes.component' import { MailComponent } from './components/manage/mail/mail.component' +import { OcrTemplateEditorComponent } from './components/manage/ocr-templates/ocr-template-editor/ocr-template-editor.component' +import { OcrTemplatesComponent } from './components/manage/ocr-templates/ocr-templates.component' import { SavedViewsComponent } from './components/manage/saved-views/saved-views.component' import { WorkflowsComponent } from './components/manage/workflows/workflows.component' import { NotFoundComponent } from './components/not-found/not-found.component' @@ -274,6 +276,30 @@ export const routes: Routes = [ componentName: 'WorkflowsComponent', }, }, + { + path: 'ocr-templates', + component: OcrTemplatesComponent, + canActivate: [PermissionsGuard], + data: { + requiredPermission: { + action: PermissionAction.View, + type: PermissionType.OcrTemplate, + }, + componentName: 'OcrTemplatesComponent', + }, + }, + { + path: 'ocr-templates/:id', + component: OcrTemplateEditorComponent, + canActivate: [PermissionsGuard], + data: { + requiredPermission: { + action: PermissionAction.Change, + type: PermissionType.OcrTemplate, + }, + componentName: 'OcrTemplateEditorComponent', + }, + }, { path: 'mail', component: MailComponent, diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html index 9fa8b8016..5d50768e9 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.html +++ b/src-ui/src/app/components/app-frame/app-frame.component.html @@ -243,6 +243,14 @@ Workflows +