From bec85f38f4d64a8f14ed8b2ed83e6278950f18a2 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 8 Aug 2015 04:49:08 -0400 Subject: [PATCH] Text parsers and OCR backends are now used in tandem for each document. --- .../hybrid_text_and_image.pdf | Bin 0 -> 15612 bytes docs/releases/2.0.rst | 1 + mayan/apps/documents/test_models.py | 4 ++ mayan/apps/ocr/classes.py | 40 +++++++++++++++-- mayan/apps/ocr/parsers.py | 24 +++++++++- mayan/apps/ocr/runtime.py | 5 --- mayan/apps/ocr/tasks.py | 5 +-- mayan/apps/ocr/test_models.py | 13 ++++-- mayan/apps/ocr/test_parsers.py | 41 +++++++++++++++++- 9 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 contrib/sample_documents/hybrid_text_and_image.pdf delete mode 100644 mayan/apps/ocr/runtime.py diff --git a/contrib/sample_documents/hybrid_text_and_image.pdf b/contrib/sample_documents/hybrid_text_and_image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cad612ae8169e006752469d654de1fef86660449 GIT binary patch literal 15612 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