{"id":113346,"date":"2026-08-24T00:42:28","date_gmt":"2026-08-24T00:42:28","guid":{"rendered":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/"},"modified":"2026-08-24T00:42:28","modified_gmt":"2026-08-24T00:42:28","slug":"building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection","status":"publish","type":"post","link":"https:\/\/youzum.net\/es\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/","title":{"rendered":"Building an End-to-End Document Intelligence Pipeline with deepDoctection"},"content":{"rendered":"<p class=\"wp-block-paragraph\">In this tutorial, we implement a document intelligence pipeline with <a href=\"https:\/\/github.com\/deepdoctection\/deepdoctection\"><strong>deepDoctection 1.2.x<\/strong><\/a> that combines layout detection, table structure recognition, OCR, reading-order reconstruction, annotation linking, and structured export in a single workflow. We configure the analyzer explicitly with DocLayNet-based layout detection, Table Transformer structure recognition, and DocTR OCR, then inspect the resulting Page objects to understand how deepDoctection represents text, figures, tables, relationships, provenance, and reading order. We also extend the framework by registering custom object types and implementing our own PipelineComponent for extracting monetary and date entities while classifying documents by their tabular characteristics. Finally, we assemble a custom pipeline manually with ServiceFactory, explore filtering and service rollback, serialize processed pages, and transform document annotations into ordered JSONL chunks suitable for downstream RAG and retrieval systems.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">!pip install -q \"deepdoctection\" \"transformers&gt;=5.2.0\" \"timm\" \"python-doctr\" \"pdfplumber\" \"networkx\" \"lxml\"\nimport os\nos.environ[\"DD_USE_TORCH\"]  = \"True\"\nos.environ[\"DPI\"]           = \"200\"\nos.environ[\"LOG_LEVEL\"]     = \"INFO\"\nos.environ[\"ENABLE_DYNAMIC_OBJECT_TYPES\"] = \"False\"\nimport json, re, textwrap\nfrom pathlib import Path\nfrom collections import Counter\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom IPython.display import HTML, display\nimport deepdoctection as dd\nprint(\"deepdoctection:\", dd.__version__)\nimport transformers.integrations.peft as _hf_peft\nif _hf_peft.is_peft_available():\n   _hf_peft.is_peft_available = lambda: False\n   print(\"patched: PEFT adapter lookup disabled for from_pretrained\")\n!mkdir -p \/content\/docs \/content\/imgs\n!wget -q -O \/content\/docs\/paper.pdf \n <p><a href=\"https:\/\/raw.githubusercontent.com\/deepdoctection\/notebooks\/main\/sample\/2312.13560.pdf\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">Click to access 2312.13560.pdf<\/a><\/p>\n!wget -q -O \/content\/imgs\/finance.png \n https:\/\/raw.githubusercontent.com\/deepdoctection\/notebooks\/main\/sample\/finance\/1bcac3899c9cb1c0b0f650b1431d3d52_7.png\nPDF = Path(\"\/content\/docs\/paper.pdf\")\nPNG = Path(\"\/content\/imgs\/finance.png\")\nOUT = Path(\"\/content\/out\"); OUT.mkdir(exist_ok=True)\ndef show(img, w=16):\n   if img is None: return\n   plt.figure(figsize=(w, w * 1.3)); plt.axis(\"off\"); plt.imshow(img); plt.show()\ndef analyze_any(pipe, path, **kw):\n   \"\"\"\n   Dispatch correctly for a directory, a PDF, or a single image file.\n   DoctectionPipe can stream a directory or a PDF from disk, but a *single*\n   image has no reader \u2014 path= only supplies the file name \/ provenance, and\n   the pixels must be handed in via bytes=. Without this you get:\n     ValueError: When passing a path to a single image, bytes of the image\n                 must be passed\n   \"\"\"\n   path = Path(path)\n   if path.is_dir():\n       kw.setdefault(\"file_type\", [\".jpg\", \".png\", \".jpeg\", \".tif\"])\n       return pipe.analyze(path=path, **kw)\n   if path.suffix.lower() == \".pdf\":\n       return pipe.analyze(path=path, **kw)\n   if path.suffix.lower() in (\".png\", \".jpg\", \".jpeg\", \".tif\"):\n       return pipe.analyze(path=path, bytes=path.read_bytes(), **kw)\n   raise ValueError(f\"unsupported input: {path}\")\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We install the required deepDoctection dependencies, configure its runtime environment, and apply a compatibility patch for Transformers and PEFT. We download the sample PDF and image files that we use throughout the tutorial and prepare our output directory. We also define helper functions to visualize images and consistently analyze directories, PDFs, and individual image files.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">dd.print_model_infos(add_description=False, add_config=False, add_categories=False)\nprofile = dd.ModelCatalog.get_profile(\"Aryn\/deformable-detr-DocLayNet\/model.safetensors\")\nprint(\"nlayout model categories:\", profile.categories)\nprint(\"is registered:\", dd.ModelCatalog.is_registered(\"Aryn\/deformable-detr-DocLayNet\/model.safetensors\"))\nconfig_overwrite = [\n   \"USE_ROTATOR=False\",\n   \"USE_LAYOUT=True\",\n   \"USE_LAYOUT_NMS=True\",\n   \"USE_TABLE_SEGMENTATION=True\",\n   \"USE_TABLE_REFINEMENT=False\",\n   \"USE_PDF_MINER=False\",\n   \"USE_OCR=True\",\n   \"USE_LAYOUT_LINK=True\",\n   \"LAYOUT.WEIGHTS=Aryn\/deformable-detr-DocLayNet\/model.safetensors\",\n   \"ITEM.WEIGHTS=deepdoctection\/tatr_tab_struct_v2\/model.safetensors\",\n   \"ITEM.FILTER=['table']\",\n   \"OCR.USE_DOCTR=True\",\n   \"OCR.USE_TESSERACT=False\",\n   \"OCR.USE_TEXTRACT=False\",\n   \"OCR.WEIGHTS.DOCTR_WORD=doctr\/db_resnet50\/db_resnet50-ac60cadc.pt\",\n   \"OCR.WEIGHTS.DOCTR_RECOGNITION=doctr\/crnn_vgg16_bn\/crnn_vgg16_bn-0417f351.pt\",\n   \"SEGMENTATION.THRESHOLD_ROWS=0.4\",\n   \"SEGMENTATION.THRESHOLD_COLS=0.4\",\n   \"SEGMENTATION.FULL_TABLE_TILING=True\",\n   \"WORD_MATCHING.RULE=ioa\",\n   \"WORD_MATCHING.THRESHOLD=0.3\",\n   \"WORD_MATCHING.MAX_PARENT_ONLY=True\",\n   \"TEXT_ORDERING.INCLUDE_RESIDUAL_TEXT_CONTAINER=True\",\n   \"TEXT_ORDERING.PARAGRAPH_BREAK=0.035\",\n   \"TEXT_ORDERING.BROKEN_LINE_TOLERANCE=0.003\",\n   \"LAYOUT_LINK.PARENTAL_CATEGORIES=['figure','table']\",\n   \"LAYOUT_LINK.CHILD_CATEGORIES=['caption']\",\n]\nanalyzer = dd.get_dd_analyzer(config_overwrite=config_overwrite)\nprint(\"n--- pipeline ---\")\nfor sid, name in analyzer.get_pipeline_info().items():\n   print(f\"{sid}  {name}\")\nprint(\"n--- what this pipeline produces ---\")\nprint(analyzer.get_meta_annotation())\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We inspect deepDoctection\u2019s model registry to verify the layout model and its supported document categories. We explicitly configure the analyzer to combine layout detection, table segmentation, DocTR OCR, word matching, reading-order reconstruction, and layout linking. We then initialize the analyzer and inspect its pipeline components and the annotation types that it produces.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">df = analyze_any(analyzer, PDF, session_id=\"tutorial01\", max_datapoints=3)\ndf.reset_state()\npages = list(df)\nprint(f\"nparsed {len(pages)} pages\")\npage = pages[0]\nshow(page.viz(show_figures=True, show_residual_layouts=True, show_table_structure=True))\nprint(\"== narrative text ==\")\nprint(textwrap.fill(page.text[:900], 110))\nprint(\"n== layout blocks in reading order ==\")\nfor doc_id, img_id, pno, ann_id, order, cat, txt in page.chunks[:12]:\n   print(f\"[{order:&gt;3}] {str(cat):&lt;15} {txt[:70]!r}\")\nprint(\"n== category histogram ==\")\nprint(Counter(a.category_name for a in page.get_annotation()))\nfor fig in page.figures:\n   linked = fig.get_relationship(\"layout_link\")\n   print(\"figure\", fig.annotation_id[:8], \"-&gt; caption ids:\", [i[:8] for i in linked])\nif page.words:\n   w = page.words[0]\n   print(\"nword:\", w.characters, \"| service:\", w.service_id,\n         \"| model:\", w.model_id, \"| bbox:\", [round(x) for x in w.bbox])\ntbl_pages = [p for p in pages if p.tables]\nif tbl_pages:\n   t = tbl_pages[0].tables[0]\n   print(f\"table {t.number_of_rows}x{t.number_of_columns}, \"\n         f\"max_row_span={t.max_row_span}, max_col_span={t.max_col_span}\")\n   display(HTML(t.html))\n   for row in t.csv[:5]:\n       print([c[:22] for c in row])\n   for c in t.cells[:5]:\n       print(f\"  r{c.row_number} c{c.column_number} \"\n             f\"(span {c.row_span}x{c.column_span}) {c.text[:40]!r}\")\nelse:\n   print(\"no table on these pages \u2014 the finance.png sample below has one\")\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We run the configured analyzer on the sample PDF and materialize the resulting pages from the lazy data flow. We inspect narrative text, reading-order chunks, annotation categories, figure-caption relationships, word provenance, and bounding boxes. We also access detected tables through HTML, CSV, and individual cell representations to examine their structured output.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">@dd.object_types_registry.register(\"CustomKey\")\nclass CustomKey(dd.ObjectTypes):\n   \"\"\"Custom summary keys \u2014 must be registered to be serialisable.\"\"\"\n   MONEY_MENTIONS = \"money_mentions\"\n   DATE_MENTIONS  = \"date_mentions\"\n   DOC_FLAVOUR    = \"doc_flavour\"\n@dd.object_types_registry.register(\"FlavourLabel\")\nclass FlavourLabel(dd.ObjectTypes):\n   TABULAR   = \"tabular\"\n   NARRATIVE = \"narrative\"\n   MIXED     = \"mixed\"\nMONEY = re.compile(r\"(?:[$\u20ac\u00a3]s?d[d,.]*|d[d,.]*s?(?:USD|EUR|GBP|million|bn))\")\nDATE  = re.compile(r\"b(?:d{1,2}[\/-]d{1,2}[\/-]d{2,4}|d{4}-d{2}-d{2}|\"\n                  r\"(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)w*s+d{1,2},?s+d{4})b\")\nclass EntityAndFlavourService(dd.PipelineComponent):\n   def __init__(self, name=\"entity_flavour\", tabular_ratio=0.25):\n       self.tabular_ratio = tabular_ratio\n       super().__init__(name)\n   def serve(self, dp: dd.Image) -&gt; None:\n       page = dd.Page.from_image(dp, text_container=dd.LayoutLabel.WORD)\n       text = page.text_no_line_break\n       money = sorted(set(MONEY.findall(text)))\n       dates = sorted(set(DATE.findall(text)))\n       tables = page.tables\n       table_area = sum((b[2] - b[0]) * (b[3] - b[1]) for b in (t.bbox for t in tables))\n       ratio = table_area \/ float(page.width * page.height or 1)\n       flavor = (FlavourLabel.TABULAR if ratio &gt; self.tabular_ratio\n                  else FlavourLabel.NARRATIVE if not tables\n                  else FlavourLabel.MIXED)\n       self.dp_manager.set_summary_annotation(\n           summary_key=CustomKey.MONEY_MENTIONS, summary_name=CustomKey.MONEY_MENTIONS,\n           summary_value=money)\n       self.dp_manager.set_summary_annotation(\n           summary_key=CustomKey.DATE_MENTIONS, summary_name=CustomKey.DATE_MENTIONS,\n           summary_value=dates)\n       self.dp_manager.set_summary_annotation(\n           summary_key=CustomKey.DOC_FLAVOUR, summary_name=flavour,\n           summary_score=round(ratio, 4))\n   def clone(self):\n       return self.__class__(self.name, self.tabular_ratio)\n   def get_meta_annotation(self) -&gt; dd.MetaAnnotation:\n       return dd.MetaAnnotation(\n           image_annotations=(),\n           sub_categories={},\n           relationships={},\n           summaries=(CustomKey.MONEY_MENTIONS, CustomKey.DATE_MENTIONS, CustomKey.DOC_FLAVOUR),\n       )\nfor k in (CustomKey.MONEY_MENTIONS, CustomKey.DATE_MENTIONS, CustomKey.DOC_FLAVOUR):\n   dd.Page.add_attribute_name(k)\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We register custom object types for extracted monetary mentions, date mentions, and document flavor classifications. We implement a custom deepDoctection pipeline component that analyzes page text and table coverage to generate these page-level summaries. We then expose the custom summary fields as Page attributes so that we can access them directly from processed documents.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">from deepdoctection.analyzer import cfg, ServiceFactory\ncfg.freeze(False)\ncfg.USE_TABLE_SEGMENTATION = True\ncfg.freeze(True)\ncomponents = []\nlayout_detector = ServiceFactory.build_layout_detector(cfg, mode=\"LAYOUT\")\ncomponents.append(ServiceFactory.build_layout_service(cfg, detector=layout_detector, mode=\"LAYOUT\"))\ncomponents.append(ServiceFactory.build_layout_nms_service(cfg))\nitem_detector = ServiceFactory.build_layout_detector(cfg, mode=\"ITEM\")\ncomponents.append(ServiceFactory.build_sub_image_service(cfg, detector=item_detector, mode=\"ITEM\"))\ncomponents.append(ServiceFactory.build_table_segmentation_service(cfg, detector=item_detector))\nword_detector = ServiceFactory.build_doctr_word_detector(cfg)\ncomponents.append(ServiceFactory.build_doctr_word_detector_service(word_detector))\ncomponents.append(ServiceFactory.build_text_extraction_service(cfg, ServiceFactory.build_ocr_detector(cfg)))\ncomponents.append(ServiceFactory.build_word_matching_service(cfg))\ncomponents.append(ServiceFactory.build_text_order_service(cfg))\ncomponents.append(EntityAndFlavourService())\ncustom_pipe = dd.DoctectionPipe(pipeline_component_list=components)\nprint(\"ncustom pipeline:\", list(custom_pipe.get_pipeline_info().values()))\ndf2 = analyze_any(custom_pipe, PNG)\ndf2.reset_state()\nfin_page = next(iter(df2))\nprint(\"flavour  :\", fin_page.doc_flavour)\nprint(\"money    :\", fin_page.money_mentions[:10])\nprint(\"dates    :\", fin_page.date_mentions[:10])\nshow(fin_page.viz(show_table_structure=True), w=13)\ndef skip_if_no_table(dp: dd.Image) -&gt; bool:\n   return \"table\" not in {a.category_name for a in dp.get_annotation()}\ncomponents[-1].set_inbound_filter(skip_if_no_table)\ndet_sid = next(sid for sid, n in analyzer.get_pipeline_info().items()\n              if n.startswith(\"image_doctr\"))\ndet_comp = analyzer.get_pipeline_component(service_id=det_sid)\ndf_undo = det_comp.undo(dd.DataFromList([p.base_image for p in pages]))\ndf_undo.reset_state()\nundone = list(df_undo)\nprint(\"annotations before\/after undo:\",\n     len(pages[0].get_annotation()),\n     len(dd.Page.from_image(undone[0]).get_annotation()))\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We manually assemble a deepDoctection pipeline with ServiceFactory, combining layout analysis, table processing, OCR, text ordering, and our custom component. We execute this custom pipeline on the financial document image and inspect the detected flavor, monetary values, dates, and table structure. We also apply an inbound filter and demonstrate how we undo the annotations produced by a selected DocTR service.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">for i, p in enumerate(pages):\n   p.save(image_to_json=False, path=OUT \/ f\"page_{i}.json\")\nrestored = dd.Page.from_file(str(OUT \/ \"page_0.json\"))\nprint(\"round-trip:\", len(restored.get_annotation()), \"of\",\n     len(pages[0].get_annotation()), \"annotations restored\")\nrecords = []\nfor p in pages:\n   for doc_id, img_id, pno, ann_id, order, cat, txt in p.chunks:\n       if txt and txt.strip():\n           records.append({\"document_id\": doc_id, \"page\": pno, \"order\": order,\n                           \"category\": str(cat), \"annotation_id\": ann_id, \"text\": txt})\n   for t in p.tables:\n       records.append({\"document_id\": p.document_id, \"page\": p.page_number,\n                       \"order\": -1, \"category\": \"table_html\",\n                       \"annotation_id\": t.annotation_id, \"text\": t.html})\n(OUT \/ \"chunks.jsonl\").write_text(\"n\".join(json.dumps(r) for r in records))\nprint(f\"n{len(records)} chunks -&gt; {OUT\/'chunks.jsonl'}\")\nprint(json.dumps(records[0], indent=2)[:400])\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We serialize each processed page to JSON while preserving its structural annotations without embedding the original image data. We reload a saved page and compare annotation counts to verify that the structural information survives serialization. We finally transform narrative chunks and table HTML into JSONL records that we can use directly in RAG, retrieval, and downstream document-processing pipelines.<\/p>\n<p class=\"wp-block-paragraph\">In conclusion, we developed a practical understanding of how deepDoctection orchestrates multiple document-analysis models and rule-based services into a configurable processing pipeline. We moved beyond simply running a predefined analyzer by inspecting model registrations, controlling individual services, accessing structured page-level annotations, extracting tables, creating custom summary metadata, and composing our own pipeline stages. We also examined how service filtering and undo operations affect annotations, giving us finer control over complex document-processing workflows. Finally, we serialized the processed document structure. We generated RAG-ready chunks, giving us a reusable foundation for building document search, knowledge extraction, retrieval-augmented generation, and other production-oriented document AI applications.<\/p>\n<p class=\"wp-block-paragraph\">\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<\/p><p class=\"wp-block-paragraph\">\n<\/p><p class=\"wp-block-paragraph\">Check out the\u00a0<strong><a href=\"https:\/\/github.com\/MARKTECHPOST-AI-MEDIA-INC\/AI-Agents-Projects-Tutorials\/blob\/main\/Computer%20Vision\/deepdoctection_advanced_document_intelligence_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong><em>.<\/em>\u00a0Also,\u00a0feel free to follow us on\u00a0<strong><a href=\"https:\/\/x.com\/intent\/follow?screen_name=marktechpost\" target=\"_blank\" rel=\"noopener\"><mark>Twitter<\/mark><\/a><\/strong>\u00a0and don\u2019t forget to join our\u00a0<strong><a href=\"https:\/\/www.reddit.com\/r\/machinelearningnews\/\" target=\"_blank\" rel=\"noopener\">150k+ML SubReddit<\/a><\/strong>\u00a0and Subscribe to\u00a0<strong><a href=\"https:\/\/magic.beehiiv.com\/v1\/f5e63dd4-5653-4f09-83e2-321a8b1ba526?email=%7B%7Bemail%7D%7D\" target=\"_blank\" rel=\"noopener\">our Newsletter<\/a><\/strong>. Wait! are you on telegram?\u00a0<strong><a href=\"https:\/\/t.me\/machinelearningresearchnews\" target=\"_blank\" rel=\"noopener\">now you can join us on telegram as well.<\/a><\/strong><\/p>\n<p class=\"wp-block-paragraph\">Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.?\u00a0<strong><a href=\"https:\/\/forms.gle\/wbash1wF6efRj8G58\" target=\"_blank\" rel=\"noopener\"><mark>Connect with us<\/mark><\/a><\/strong><\/p>\n<p>The post <a href=\"https:\/\/www.marktechpost.com\/2026\/08\/23\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\">Building an End-to-End Document Intelligence Pipeline with deepDoctection<\/a> appeared first on <a href=\"https:\/\/www.marktechpost.com\/\">MarkTechPost<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>In this tutorial, we implement a document intelligence pipeline with deepDoctection 1.2.x that combines layout detection, table structure recognition, OCR, reading-order reconstruction, annotation linking, and structured export in a single workflow. We configure the analyzer explicitly with DocLayNet-based layout detection, Table Transformer structure recognition, and DocTR OCR, then inspect the resulting Page objects to understand how deepDoctection represents text, figures, tables, relationships, provenance, and reading order. We also extend the framework by registering custom object types and implementing our own PipelineComponent for extracting monetary and date entities while classifying documents by their tabular characteristics. Finally, we assemble a custom pipeline manually with ServiceFactory, explore filtering and service rollback, serialize processed pages, and transform document annotations into ordered JSONL chunks suitable for downstream RAG and retrieval systems. Copy CodeCopiedUse a different Browser !pip install -q &#8220;deepdoctection&#8221; &#8220;transformers&gt;=5.2.0&#8221; &#8220;timm&#8221; &#8220;python-doctr&#8221; &#8220;pdfplumber&#8221; &#8220;networkx&#8221; &#8220;lxml&#8221; import os os.environ[&#8220;DD_USE_TORCH&#8221;] = &#8220;True&#8221; os.environ[&#8220;DPI&#8221;] = &#8220;200&#8221; os.environ[&#8220;LOG_LEVEL&#8221;] = &#8220;INFO&#8221; os.environ[&#8220;ENABLE_DYNAMIC_OBJECT_TYPES&#8221;] = &#8220;False&#8221; import json, re, textwrap from pathlib import Path from collections import Counter import numpy as np import matplotlib.pyplot as plt from IPython.display import HTML, display import deepdoctection as dd print(&#8220;deepdoctection:&#8221;, dd.__version__) import transformers.integrations.peft as _hf_peft if _hf_peft.is_peft_available(): _hf_peft.is_peft_available = lambda: False print(&#8220;patched: PEFT adapter lookup disabled for from_pretrained&#8221;) !mkdir -p \/content\/docs \/content\/imgs !wget -q -O \/content\/docs\/paper.pdf Click to access 2312.13560.pdf !wget -q -O \/content\/imgs\/finance.png https:\/\/raw.githubusercontent.com\/deepdoctection\/notebooks\/main\/sample\/finance\/1bcac3899c9cb1c0b0f650b1431d3d52_7.png PDF = Path(&#8220;\/content\/docs\/paper.pdf&#8221;) PNG = Path(&#8220;\/content\/imgs\/finance.png&#8221;) OUT = Path(&#8220;\/content\/out&#8221;); OUT.mkdir(exist_ok=True) def show(img, w=16): if img is None: return plt.figure(figsize=(w, w * 1.3)); plt.axis(&#8220;off&#8221;); plt.imshow(img); plt.show() def analyze_any(pipe, path, **kw): &#8220;&#8221;&#8221; Dispatch correctly for a directory, a PDF, or a single image file. DoctectionPipe can stream a directory or a PDF from disk, but a *single* image has no reader \u2014 path= only supplies the file name \/ provenance, and the pixels must be handed in via bytes=. Without this you get: ValueError: When passing a path to a single image, bytes of the image must be passed &#8220;&#8221;&#8221; path = Path(path) if path.is_dir(): kw.setdefault(&#8220;file_type&#8221;, [&#8220;.jpg&#8221;, &#8220;.png&#8221;, &#8220;.jpeg&#8221;, &#8220;.tif&#8221;]) return pipe.analyze(path=path, **kw) if path.suffix.lower() == &#8220;.pdf&#8221;: return pipe.analyze(path=path, **kw) if path.suffix.lower() in (&#8220;.png&#8221;, &#8220;.jpg&#8221;, &#8220;.jpeg&#8221;, &#8220;.tif&#8221;): return pipe.analyze(path=path, bytes=path.read_bytes(), **kw) raise ValueError(f&#8221;unsupported input: {path}&#8221;) We install the required deepDoctection dependencies, configure its runtime environment, and apply a compatibility patch for Transformers and PEFT. We download the sample PDF and image files that we use throughout the tutorial and prepare our output directory. We also define helper functions to visualize images and consistently analyze directories, PDFs, and individual image files. Copy CodeCopiedUse a different Browser dd.print_model_infos(add_description=False, add_config=False, add_categories=False) profile = dd.ModelCatalog.get_profile(&#8220;Aryn\/deformable-detr-DocLayNet\/model.safetensors&#8221;) print(&#8220;nlayout model categories:&#8221;, profile.categories) print(&#8220;is registered:&#8221;, dd.ModelCatalog.is_registered(&#8220;Aryn\/deformable-detr-DocLayNet\/model.safetensors&#8221;)) config_overwrite = [ &#8220;USE_ROTATOR=False&#8221;, &#8220;USE_LAYOUT=True&#8221;, &#8220;USE_LAYOUT_NMS=True&#8221;, &#8220;USE_TABLE_SEGMENTATION=True&#8221;, &#8220;USE_TABLE_REFINEMENT=False&#8221;, &#8220;USE_PDF_MINER=False&#8221;, &#8220;USE_OCR=True&#8221;, &#8220;USE_LAYOUT_LINK=True&#8221;, &#8220;LAYOUT.WEIGHTS=Aryn\/deformable-detr-DocLayNet\/model.safetensors&#8221;, &#8220;ITEM.WEIGHTS=deepdoctection\/tatr_tab_struct_v2\/model.safetensors&#8221;, &#8220;ITEM.FILTER=[&#8216;table&#8217;]&#8221;, &#8220;OCR.USE_DOCTR=True&#8221;, &#8220;OCR.USE_TESSERACT=False&#8221;, &#8220;OCR.USE_TEXTRACT=False&#8221;, &#8220;OCR.WEIGHTS.DOCTR_WORD=doctr\/db_resnet50\/db_resnet50-ac60cadc.pt&#8221;, &#8220;OCR.WEIGHTS.DOCTR_RECOGNITION=doctr\/crnn_vgg16_bn\/crnn_vgg16_bn-0417f351.pt&#8221;, &#8220;SEGMENTATION.THRESHOLD_ROWS=0.4&#8221;, &#8220;SEGMENTATION.THRESHOLD_COLS=0.4&#8221;, &#8220;SEGMENTATION.FULL_TABLE_TILING=True&#8221;, &#8220;WORD_MATCHING.RULE=ioa&#8221;, &#8220;WORD_MATCHING.THRESHOLD=0.3&#8221;, &#8220;WORD_MATCHING.MAX_PARENT_ONLY=True&#8221;, &#8220;TEXT_ORDERING.INCLUDE_RESIDUAL_TEXT_CONTAINER=True&#8221;, &#8220;TEXT_ORDERING.PARAGRAPH_BREAK=0.035&#8221;, &#8220;TEXT_ORDERING.BROKEN_LINE_TOLERANCE=0.003&#8221;, &#8220;LAYOUT_LINK.PARENTAL_CATEGORIES=[&#8216;figure&#8217;,&#8217;table&#8217;]&#8221;, &#8220;LAYOUT_LINK.CHILD_CATEGORIES=[&#8216;caption&#8217;]&#8221;, ] analyzer = dd.get_dd_analyzer(config_overwrite=config_overwrite) print(&#8220;n&#8212; pipeline &#8212;&#8220;) for sid, name in analyzer.get_pipeline_info().items(): print(f&#8221;{sid} {name}&#8221;) print(&#8220;n&#8212; what this pipeline produces &#8212;&#8220;) print(analyzer.get_meta_annotation()) We inspect deepDoctection\u2019s model registry to verify the layout model and its supported document categories. We explicitly configure the analyzer to combine layout detection, table segmentation, DocTR OCR, word matching, reading-order reconstruction, and layout linking. We then initialize the analyzer and inspect its pipeline components and the annotation types that it produces. Copy CodeCopiedUse a different Browser df = analyze_any(analyzer, PDF, session_id=&#8221;tutorial01&#8243;, max_datapoints=3) df.reset_state() pages = list(df) print(f&#8221;nparsed {len(pages)} pages&#8221;) page = pages[0] show(page.viz(show_figures=True, show_residual_layouts=True, show_table_structure=True)) print(&#8220;== narrative text ==&#8221;) print(textwrap.fill(page.text[:900], 110)) print(&#8220;n== layout blocks in reading order ==&#8221;) for doc_id, img_id, pno, ann_id, order, cat, txt in page.chunks[:12]: print(f&#8221;[{order:&gt;3}] {str(cat):&lt;15} {txt[:70]!r}&#8221;) print(&#8220;n== category histogram ==&#8221;) print(Counter(a.category_name for a in page.get_annotation())) for fig in page.figures: linked = fig.get_relationship(&#8220;layout_link&#8221;) print(&#8220;figure&#8221;, fig.annotation_id[:8], &#8220;-&gt; caption ids:&#8221;, [i[:8] for i in linked]) if page.words: w = page.words[0] print(&#8220;nword:&#8221;, w.characters, &#8220;| service:&#8221;, w.service_id, &#8220;| model:&#8221;, w.model_id, &#8220;| bbox:&#8221;, [round(x) for x in w.bbox]) tbl_pages = [p for p in pages if p.tables] if tbl_pages: t = tbl_pages[0].tables[0] print(f&#8221;table {t.number_of_rows}x{t.number_of_columns}, &#8221; f&#8221;max_row_span={t.max_row_span}, max_col_span={t.max_col_span}&#8221;) display(HTML(t.html)) for row in t.csv[:5]: print([c[:22] for c in row]) for c in t.cells[:5]: print(f&#8221; r{c.row_number} c{c.column_number} &#8221; f&#8221;(span {c.row_span}x{c.column_span}) {c.text[:40]!r}&#8221;) else: print(&#8220;no table on these pages \u2014 the finance.png sample below has one&#8221;) We run the configured analyzer on the sample PDF and materialize the resulting pages from the lazy data flow. We inspect narrative text, reading-order chunks, annotation categories, figure-caption relationships, word provenance, and bounding boxes. We also access detected tables through HTML, CSV, and individual cell representations to examine their structured output. Copy CodeCopiedUse a different Browser @dd.object_types_registry.register(&#8220;CustomKey&#8221;) class CustomKey(dd.ObjectTypes): &#8220;&#8221;&#8221;Custom summary keys \u2014 must be registered to be serialisable.&#8221;&#8221;&#8221; MONEY_MENTIONS = &#8220;money_mentions&#8221; DATE_MENTIONS = &#8220;date_mentions&#8221; DOC_FLAVOUR = &#8220;doc_flavour&#8221; @dd.object_types_registry.register(&#8220;FlavourLabel&#8221;) class FlavourLabel(dd.ObjectTypes): TABULAR = &#8220;tabular&#8221; NARRATIVE = &#8220;narrative&#8221; MIXED = &#8220;mixed&#8221; MONEY = re.compile(r&#8221;(?:[$\u20ac\u00a3]s?d[d,.]*|d[d,.]*s?(?:USD|EUR|GBP|million|bn))&#8221;) DATE = re.compile(r&#8221;b(?:d{1,2}[\/-]d{1,2}[\/-]d{2,4}|d{4}-d{2}-d{2}|&#8221; r&#8221;(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)w*s+d{1,2},?s+d{4})b&#8221;) class EntityAndFlavourService(dd.PipelineComponent): def __init__(self, name=&#8221;entity_flavour&#8221;, tabular_ratio=0.25): self.tabular_ratio = tabular_ratio super().__init__(name) def serve(self, dp: dd.Image) -&gt; None: page = dd.Page.from_image(dp, text_container=dd.LayoutLabel.WORD) text = page.text_no_line_break money = sorted(set(MONEY.findall(text))) dates = sorted(set(DATE.findall(text))) tables = page.tables table_area = sum((b[2] &#8211; b[0]) * (b[3] &#8211; b[1]) for b in (t.bbox for t in tables)) ratio = table_area \/ float(page.width * page.height or 1) flavor = (FlavourLabel.TABULAR if ratio &gt; self.tabular_ratio else FlavourLabel.NARRATIVE if not tables else FlavourLabel.MIXED) self.dp_manager.set_summary_annotation( summary_key=CustomKey.MONEY_MENTIONS, summary_name=CustomKey.MONEY_MENTIONS, summary_value=money) self.dp_manager.set_summary_annotation( summary_key=CustomKey.DATE_MENTIONS, summary_name=CustomKey.DATE_MENTIONS, summary_value=dates) self.dp_manager.set_summary_annotation( summary_key=CustomKey.DOC_FLAVOUR, summary_name=flavour, summary_score=round(ratio, 4)) def clone(self): return self.__class__(self.name, self.tabular_ratio) def get_meta_annotation(self) -&gt; dd.MetaAnnotation: return dd.MetaAnnotation( image_annotations=(), sub_categories={}, relationships={}, summaries=(CustomKey.MONEY_MENTIONS, CustomKey.DATE_MENTIONS, CustomKey.DOC_FLAVOUR), ) for k in (CustomKey.MONEY_MENTIONS, CustomKey.DATE_MENTIONS, CustomKey.DOC_FLAVOUR): dd.Page.add_attribute_name(k) We register custom object types for extracted monetary mentions, date mentions, and document flavor classifications. We implement a custom deepDoctection pipeline component that analyzes page text and table coverage to generate these page-level summaries. We then expose the custom summary fields as Page attributes so that we can access them directly from processed documents. Copy CodeCopiedUse a different Browser from deepdoctection.analyzer import cfg, ServiceFactory cfg.freeze(False) cfg.USE_TABLE_SEGMENTATION = True cfg.freeze(True) components = [] layout_detector = ServiceFactory.build_layout_detector(cfg, mode=&#8221;LAYOUT&#8221;) components.append(ServiceFactory.build_layout_service(cfg, detector=layout_detector, mode=&#8221;LAYOUT&#8221;)) components.append(ServiceFactory.build_layout_nms_service(cfg)) item_detector = ServiceFactory.build_layout_detector(cfg, mode=&#8221;ITEM&#8221;) components.append(ServiceFactory.build_sub_image_service(cfg, detector=item_detector, mode=&#8221;ITEM&#8221;)) components.append(ServiceFactory.build_table_segmentation_service(cfg, detector=item_detector)) word_detector = ServiceFactory.build_doctr_word_detector(cfg) components.append(ServiceFactory.build_doctr_word_detector_service(word_detector)) components.append(ServiceFactory.build_text_extraction_service(cfg, ServiceFactory.build_ocr_detector(cfg))) components.append(ServiceFactory.build_word_matching_service(cfg)) components.append(ServiceFactory.build_text_order_service(cfg)) components.append(EntityAndFlavourService()) custom_pipe = dd.DoctectionPipe(pipeline_component_list=components) print(&#8220;ncustom pipeline:&#8221;, list(custom_pipe.get_pipeline_info().values())) df2 = analyze_any(custom_pipe, PNG) df2.reset_state() fin_page = next(iter(df2)) print(&#8220;flavour :&#8221;,<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_pvb_checkbox_block_on_post":false,"footnotes":""},"categories":[52,5,7,1],"tags":[],"class_list":["post-113346","post","type-post","status-publish","format-standard","hentry","category-ai-club","category-committee","category-news","category-uncategorized","pmpro-has-access"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building an End-to-End Document Intelligence Pipeline with deepDoctection - YouZum<\/title>\n<meta name=\"description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/youzum.net\/es\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building an End-to-End Document Intelligence Pipeline with deepDoctection - YouZum\" \/>\n<meta property=\"og:description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta property=\"og:url\" content=\"https:\/\/youzum.net\/es\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\" \/>\n<meta property=\"og:site_name\" content=\"YouZum\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DroneAssociationTH\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-24T00:42:28+00:00\" \/>\n<meta name=\"author\" content=\"admin NU\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin NU\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\"},\"author\":{\"name\":\"admin NU\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\"},\"headline\":\"Building an End-to-End Document Intelligence Pipeline with deepDoctection\",\"datePublished\":\"2026-08-24T00:42:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\"},\"wordCount\":689,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"articleSection\":[\"AI\",\"Committee\",\"News\",\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\",\"url\":\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\",\"name\":\"Building an End-to-End Document Intelligence Pipeline with deepDoctection - YouZum\",\"isPartOf\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#website\"},\"datePublished\":\"2026-08-24T00:42:28+00:00\",\"description\":\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\",\"breadcrumb\":{\"@id\":\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/youzum.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building an End-to-End Document Intelligence Pipeline with deepDoctection\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/yousum.gpucore.co\/#website\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"name\":\"YouSum\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/yousum.gpucore.co\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\",\"name\":\"Drone Association Thailand\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"width\":300,\"height\":300,\"caption\":\"Drone Association Thailand\"},\"image\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/DroneAssociationTH\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\",\"name\":\"admin NU\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"caption\":\"admin NU\"},\"url\":\"https:\/\/youzum.net\/es\/members\/adminnu\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building an End-to-End Document Intelligence Pipeline with deepDoctection - YouZum","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/youzum.net\/es\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/","og_locale":"es_ES","og_type":"article","og_title":"Building an End-to-End Document Intelligence Pipeline with deepDoctection - YouZum","og_description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","og_url":"https:\/\/youzum.net\/es\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/","og_site_name":"YouZum","article_publisher":"https:\/\/www.facebook.com\/DroneAssociationTH\/","article_published_time":"2026-08-24T00:42:28+00:00","author":"admin NU","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"admin NU","Tiempo de lectura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#article","isPartOf":{"@id":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/"},"author":{"name":"admin NU","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c"},"headline":"Building an End-to-End Document Intelligence Pipeline with deepDoctection","datePublished":"2026-08-24T00:42:28+00:00","mainEntityOfPage":{"@id":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/"},"wordCount":689,"commentCount":0,"publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"articleSection":["AI","Committee","News","Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/","url":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/","name":"Building an End-to-End Document Intelligence Pipeline with deepDoctection - YouZum","isPartOf":{"@id":"https:\/\/yousum.gpucore.co\/#website"},"datePublished":"2026-08-24T00:42:28+00:00","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","breadcrumb":{"@id":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/youzum.net\/building-an-end-to-end-document-intelligence-pipeline-with-deepdoctection\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/youzum.net\/"},{"@type":"ListItem","position":2,"name":"Building an End-to-End Document Intelligence Pipeline with deepDoctection"}]},{"@type":"WebSite","@id":"https:\/\/yousum.gpucore.co\/#website","url":"https:\/\/yousum.gpucore.co\/","name":"YouSum","description":"","publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yousum.gpucore.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/yousum.gpucore.co\/#organization","name":"Drone Association Thailand","url":"https:\/\/yousum.gpucore.co\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","width":300,"height":300,"caption":"Drone Association Thailand"},"image":{"@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DroneAssociationTH\/"]},{"@type":"Person","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c","name":"admin NU","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","caption":"admin NU"},"url":"https:\/\/youzum.net\/es\/members\/adminnu\/"}]}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"admin NU","author_link":"https:\/\/youzum.net\/es\/members\/adminnu\/"},"rttpg_comment":0,"rttpg_category":"<a href=\"https:\/\/youzum.net\/es\/category\/ai-club\/\" rel=\"category tag\">AI<\/a> <a href=\"https:\/\/youzum.net\/es\/category\/committee\/\" rel=\"category tag\">Committee<\/a> <a href=\"https:\/\/youzum.net\/es\/category\/news\/\" rel=\"category tag\">News<\/a> <a href=\"https:\/\/youzum.net\/es\/category\/uncategorized\/\" rel=\"category tag\">Uncategorized<\/a>","rttpg_excerpt":"In this tutorial, we implement a document intelligence pipeline with deepDoctection 1.2.x that combines layout detection, table structure recognition, OCR, reading-order reconstruction, annotation linking, and structured export in a single workflow. We configure the analyzer explicitly with DocLayNet-based layout detection, Table Transformer structure recognition, and DocTR OCR, then inspect the resulting Page objects to understand&hellip;","_links":{"self":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/posts\/113346","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/comments?post=113346"}],"version-history":[{"count":0,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/posts\/113346\/revisions"}],"wp:attachment":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/media?parent=113346"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/categories?post=113346"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/tags?post=113346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}