]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Basic parse
authorshamoon <4887959+shamoon@users.noreply.github.com>
Fri, 18 Apr 2025 19:04:09 +0000 (12:04 -0700)
committershamoon <4887959+shamoon@users.noreply.github.com>
Tue, 8 Jul 2025 21:19:42 +0000 (14:19 -0700)
pyproject.toml
src/paperless_remote/parsers.py
src/paperless_remote/tests/test_parser.py
uv.lock

index ad22ce6146498981666b4efec38642877d87ca4c..5fb6ffa52969e09399ba9be71a934439a38930f8 100644 (file)
@@ -15,6 +15,7 @@ classifiers = [
 # This will allow testing to not install a webserver, mysql, etc
 
 dependencies = [
+  "azure-ai-documentintelligence>=1.0.2",
   "bleach~=6.2.0",
   "celery[redis]~=5.5.1",
   "channels~=4.2",
index 03b53793c12a7d3125eed51a351438507b2e6d02..1a04f067a7f28616789dbe8697a168328263b379 100644 (file)
@@ -1,3 +1,5 @@
+import subprocess
+import tempfile
 from pathlib import Path
 
 from django.conf import settings
@@ -61,7 +63,41 @@ class RemoteDocumentParser(RasterisedDocumentParser):
         """
         This method uses the Azure AI Vision API to parse documents
         """
-        # TODO: Implement the Azure AI Vision API parsing logic
+        from azure.ai.documentintelligence import DocumentIntelligenceClient
+        from azure.core.credentials import AzureKeyCredential
+
+        client = DocumentIntelligenceClient(
+            endpoint=self.settings.endpoint,
+            credential=AzureKeyCredential(self.settings.api_key),
+        )
+
+        with file.open("rb") as f:
+            poller = client.begin_analyze_document(
+                model_id="prebuilt-read",
+                analyze_request=f,
+                content_type="application/octet-stream",
+                output_format="pdf",
+            )
+
+        result = poller.result()
+
+        # Download the PDF with embedded text
+        pdf_bytes = client.get_analyze_result_pdf(result.result_id)
+        self.archive_path = Path(self.tempdir) / "archive.pdf"
+        self.archive_path.write_bytes(pdf_bytes)
+
+        with tempfile.NamedTemporaryFile(delete=False, suffix=".txt") as tmp:
+            subprocess.run(
+                [
+                    "pdftotext",
+                    "-q",
+                    "-layout",
+                    str(self.archive_path),
+                    tmp.name,
+                ],
+            )
+            with Path.open(tmp.name, encoding="utf-8") as t:
+                return t.read()
 
     def parse(self, document_path: Path, mime_type, file_name=None):
         if not self.settings.engine_is_valid():
index 160796fe0f48e79bdf6d9fe6c86c1d5542474551..0bc046037d922f771d278ccd4c20edd30de49fe3 100644 (file)
@@ -75,7 +75,7 @@ class TestParser(DirectoriesMixin, FileSystemAssertsMixin, TestCase):
         mock_azure_client.return_value.begin_analyze_document.return_value.result.return_value = result
 
         with override_settings(
-            REMOTE_OCR_ENGINE="azureaivision",
+            REMOTE_OCR_ENGINE="azureai",
             REMOTE_OCR_API_KEY="somekey",
             REMOTE_OCR_ENDPOINT="https://endpoint.cognitiveservices.azure.com/",
         ):
diff --git a/uv.lock b/uv.lock
index ee5ecced287e66e7c61d27ae8954988a5760254c..bdcc616c731f9308a2c3946ea361a647038cb32b 100644 (file)
--- a/uv.lock
+++ b/uv.lock
@@ -93,6 +93,34 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/af/cc/55a32a2c98022d88812b5986d2a92c4ff3ee087e83b712ebc703bba452bf/Automat-24.8.1-py3-none-any.whl", hash = "sha256:bf029a7bc3da1e2c24da2343e7598affaa9f10bf0ab63ff808566ce90551e02a", size = 42585, upload-time = "2024-08-19T17:31:56.729Z" },
 ]
 
+[[package]]
+name = "azure-ai-documentintelligence"
+version = "1.0.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "azure-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+    { name = "isodate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+    { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/44/7b/8115cd713e2caa5e44def85f2b7ebd02a74ae74d7113ba20bdd41fd6dd80/azure_ai_documentintelligence-1.0.2.tar.gz", hash = "sha256:4d75a2513f2839365ebabc0e0e1772f5601b3a8c9a71e75da12440da13b63484", size = 170940 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/d9/75/c9ec040f23082f54ffb1977ff8f364c2d21c79a640a13d1c1809e7fd6b1a/azure_ai_documentintelligence-1.0.2-py3-none-any.whl", hash = "sha256:e1fb446abbdeccc9759d897898a0fe13141ed29f9ad11fc705f951925822ed59", size = 106005 },
+]
+
+[[package]]
+name = "azure-core"
+version = "1.33.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+    { name = "six", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+    { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/75/aa/7c9db8edd626f1a7d99d09ef7926f6f4fb34d5f9fa00dc394afdfe8e2a80/azure_core-1.33.0.tar.gz", hash = "sha256:f367aa07b5e3005fec2c1e184b882b0b039910733907d001c20fb08ebb8c0eb9", size = 295633 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/07/b7/76b7e144aa53bd206bf1ce34fa75350472c3f69bf30e5c8c18bc9881035d/azure_core-1.33.0-py3-none-any.whl", hash = "sha256:9b5b6d0223a1d38c37500e6971118c1e0f13f54951e6893968b38910bc9cda8f", size = 207071 },
+]
+
 [[package]]
 name = "babel"
 version = "2.17.0"
@@ -1383,6 +1411,15 @@ wheels = [
     { url = "https://files.pythonhosted.org/packages/c7/fc/4e5a141c3f7c7bed550ac1f69e599e92b6be449dd4677ec09f325cad0955/inotifyrecursive-0.3.5-py3-none-any.whl", hash = "sha256:7e5f4a2e1dc2bef0efa3b5f6b339c41fb4599055a2b54909d020e9e932cc8d2f", size = 8009, upload-time = "2020-11-20T12:38:46.981Z" },
 ]
 
+[[package]]
+name = "isodate"
+version = "0.7.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 },
+]
+
 [[package]]
 name = "jinja2"
 version = "3.1.6"
@@ -1911,6 +1948,7 @@ name = "paperless-ngx"
 version = "2.17.1"
 source = { virtual = "." }
 dependencies = [
+    { name = "azure-ai-documentintelligence", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
     { name = "bleach", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
     { name = "celery", extra = ["redis"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
     { name = "channels", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
@@ -2042,6 +2080,7 @@ typing = [
 
 [package.metadata]
 requires-dist = [
+    { name = "azure-ai-documentintelligence", specifier = ">=1.0.2" },
     { name = "bleach", specifier = "~=6.2.0" },
     { name = "celery", extras = ["redis"], specifier = "~=5.5.1" },
     { name = "channels", specifier = "~=4.2" },