From e96d65f9451a1b92aaec0085654c21a50d581adc Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:38:35 -0800 Subject: [PATCH] Allows parsing of WebP format images --- src/paperless_tesseract/parsers.py | 1 + src/paperless_tesseract/signals.py | 1 + .../tests/samples/document.webp | Bin 0 -> 5794 bytes src/paperless_tesseract/tests/test_parser.py | 19 ++++++++++++++---- 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100755 src/paperless_tesseract/tests/samples/document.webp diff --git a/src/paperless_tesseract/parsers.py b/src/paperless_tesseract/parsers.py index aa3ad64fa..bde2ad25e 100644 --- a/src/paperless_tesseract/parsers.py +++ b/src/paperless_tesseract/parsers.py @@ -66,6 +66,7 @@ class RasterisedDocumentParser(DocumentParser): "image/tiff", "image/bmp", "image/gif", + "image/webp", ] def has_alpha(self, image): diff --git a/src/paperless_tesseract/signals.py b/src/paperless_tesseract/signals.py index 85f2cab9f..c4fd1e039 100644 --- a/src/paperless_tesseract/signals.py +++ b/src/paperless_tesseract/signals.py @@ -15,5 +15,6 @@ def tesseract_consumer_declaration(sender, **kwargs): "image/tiff": ".tif", "image/gif": ".gif", "image/bmp": ".bmp", + "image/webp": ".webp", }, } diff --git a/src/paperless_tesseract/tests/samples/document.webp b/src/paperless_tesseract/tests/samples/document.webp new file mode 100755 index 0000000000000000000000000000000000000000..c19ba298004c5e585470a8b012f0bee8829a151f GIT binary patch literal 5794 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 literal 0 HcmV?d00001 diff --git a/src/paperless_tesseract/tests/test_parser.py b/src/paperless_tesseract/tests/test_parser.py index 67c1ad859..a0550bde9 100644 --- a/src/paperless_tesseract/tests/test_parser.py +++ b/src/paperless_tesseract/tests/test_parser.py @@ -597,23 +597,34 @@ class TestParserFileTypes(DirectoriesMixin, TestCase): parser = RasterisedDocumentParser(None) parser.parse(os.path.join(self.SAMPLE_FILES, "simple.bmp"), "image/bmp") self.assertTrue(os.path.isfile(parser.archive_path)) - self.assertTrue("this is a test document" in parser.get_text().lower()) + self.assertIn("this is a test document", parser.get_text().lower()) def test_jpg(self): parser = RasterisedDocumentParser(None) parser.parse(os.path.join(self.SAMPLE_FILES, "simple.jpg"), "image/jpeg") self.assertTrue(os.path.isfile(parser.archive_path)) - self.assertTrue("this is a test document" in parser.get_text().lower()) + self.assertIn("this is a test document", parser.get_text().lower()) @override_settings(OCR_IMAGE_DPI=200) def test_gif(self): parser = RasterisedDocumentParser(None) parser.parse(os.path.join(self.SAMPLE_FILES, "simple.gif"), "image/gif") self.assertTrue(os.path.isfile(parser.archive_path)) - self.assertTrue("this is a test document" in parser.get_text().lower()) + self.assertIn("this is a test document", parser.get_text().lower()) def test_tiff(self): parser = RasterisedDocumentParser(None) parser.parse(os.path.join(self.SAMPLE_FILES, "simple.tif"), "image/tiff") self.assertTrue(os.path.isfile(parser.archive_path)) - self.assertTrue("this is a test document" in parser.get_text().lower()) + self.assertIn("this is a test document", parser.get_text().lower()) + + @override_settings(OCR_IMAGE_DPI=72) + def test_webp(self): + parser = RasterisedDocumentParser(None) + parser.parse(os.path.join(self.SAMPLE_FILES, "document.webp"), "image/webp") + self.assertTrue(os.path.isfile(parser.archive_path)) + # OCR consistent mangles this space, oh well + self.assertIn( + "this is awebp document, created 11/14/2022.", + parser.get_text().lower(), + )