AutomationFlowsWeb Scraping › Extract Text From Receipts with Ocr.space Table Recognition

Extract Text From Receipts with Ocr.space Table Recognition

ByArkadiusz @akadiusz on n8n.io

This workflow automates the process of extracting text from receipt or document images using OCR.space and presenting the results in a clean, styled form.

Event trigger★★★☆☆ complexity9 nodesForm TriggerHTTP RequestForm
Web Scraping Trigger: Event Nodes: 9 Complexity: ★★★☆☆ Added:

This workflow corresponds to n8n.io template #8506 — we link there as the canonical source.

This workflow follows the Form → Form Trigger recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "id": "0663af99-4977-4723-828d-d5e5725d036a",
      "name": "Trigger \u2022 Upload image for OCR",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        576,
        288
      ],
      "parameters": {
        "options": {},
        "formTitle": "Receipt OCR",
        "formFields": {
          "values": [
            {
              "fieldType": "file",
              "fieldLabel": "File (Max 1MB)",
              "multipleFiles": false,
              "requiredField": true
            },
            {
              "fieldType": "radio",
              "fieldLabel": "Is it a table",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Yes"
                  },
                  {
                    "option": "No"
                  }
                ]
              },
              "requiredField": true
            }
          ]
        },
        "formDescription": "Upload an image to extract text via OCR.\nMax file size: 1 MB"
      },
      "typeVersion": 2.3,
      "alwaysOutputData": false
    },
    {
      "id": "815fc903-a65e-46a5-8177-a0cf8d40aa01",
      "name": "Prepare \u2022 Normalize inputs",
      "type": "n8n-nodes-base.set",
      "position": [
        832,
        288
      ],
      "parameters": {
        "options": {
          "stripBinary": false
        },
        "assignments": {
          "assignments": [
            {
              "id": "c454bde2-a211-448e-ac21-e044044915f6",
              "name": "isTable",
              "type": "string",
              "value": "={{ ($json[\"Is it a table\"] ?? $json.Is_it_a_table) === \"Yes\" }}"
            },
            {
              "id": "07545925-b27a-4471-a5d0-93abc740acf6",
              "name": "File (Max 1MB)",
              "type": "object",
              "value": "={{ $json['File (Max 1MB)'] ?? $json.File__Max_1MB_ }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "baf07380-1179-4077-9c7f-07c92e65bee5",
      "name": "OCR.space \u2022 Parse image",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1088,
        288
      ],
      "parameters": {
        "url": "https://api.ocr.space/parse/image",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "language",
              "value": "pol"
            },
            {
              "name": "file",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "File__Max_1MB_"
            },
            {
              "name": "OCREngine",
              "value": "2"
            },
            {
              "name": "isTable",
              "value": "={{ $json.isTable }}"
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3e1fe87f-e776-469d-bae4-f76de5032ec3",
      "name": "Display \u2022 Show OCR text",
      "type": "n8n-nodes-base.form",
      "position": [
        1344,
        288
      ],
      "parameters": {
        "options": {
          "customCss": ".card {\n\tposition: relative;\n\tmax-width: 500px;\n\tmargin: 20px auto;\n\tpadding: 20px;\n\tbackground: #fefefe !important;\n\tborder-radius: 12px;\n\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n\tfont-family: 'Courier New', monospace;\n\tcolor: #1f2937;\n\tfont-size: 16px;\n\tline-height: 1.6;\n\twhite-space: pre-wrap;\n}\n\n.header p { text-align: left; }\n\n@media (max-width: 768px) {\n\t.card { margin: 10px !important; padding: 15px !important; font-size: 14px; }\n}\n",
          "formTitle": "OCR Result"
        },
        "operation": "completion",
        "completionTitle": "OCR Result",
        "completionMessage": "={{ $json.ParsedResults[0].ParsedText }}"
      },
      "typeVersion": 2.3
    },
    {
      "id": "ba102eff-44a3-48f3-bf37-2c4db27fa1a0",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        96
      ],
      "parameters": {
        "height": 176,
        "content": "### \ud83d\udccc What this flow does  \nUpload a receipt image \u2192 select if it\u2019s a table \u2192 OCR.space parses it \u2192 result displayed in a styled card."
      },
      "typeVersion": 1
    },
    {
      "id": "4c2f78c5-f0f1-40b8-a776-8fd846ec6922",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        96
      ],
      "parameters": {
        "height": 400,
        "content": "### \ud83d\udd39 Trigger \u2022 Upload image for OCR  \nPublic form that collects the image (\u22641 MB) and asks if the content is a table."
      },
      "typeVersion": 1
    },
    {
      "id": "f9d0e10c-466b-4456-9f89-2d50e4a1cf46",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        96
      ],
      "parameters": {
        "width": 256,
        "height": 400,
        "content": "### \ud83d\udd39 Prepare \u2022 Normalize inputs  \nConverts the radio field (\u201cYes/No\u201d) into a true/false `isTable` flag. Keeps the uploaded file attached."
      },
      "typeVersion": 1
    },
    {
      "id": "36621099-7926-463a-a36d-f185cbfb8b82",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1008,
        96
      ],
      "parameters": {
        "width": 256,
        "height": 400,
        "content": "### \ud83d\udd39 OCR.space \u2022 Parse image  \nSends file + options to OCR.space API.  \nLanguage = `pol`, Engine = `2`, passes `isTable`.  \n\u26a0\ufe0f Needs API key (header auth)."
      },
      "typeVersion": 1
    },
    {
      "id": "70f2a795-2c1c-4265-b5d2-af8af703814c",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1264,
        96
      ],
      "parameters": {
        "height": 400,
        "content": "### \ud83d\udd39 Display \u2022 Show OCR text  \nShows parsed text from `ParsedResults[0].ParsedText` inside a clean, monospace card for easy copy-paste."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "OCR.space \u2022 Parse image": {
      "main": [
        [
          {
            "node": "Display \u2022 Show OCR text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare \u2022 Normalize inputs": {
      "main": [
        [
          {
            "node": "OCR.space \u2022 Parse image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger \u2022 Upload image for OCR": {
      "main": [
        [
          {
            "node": "Prepare \u2022 Normalize inputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automates the process of extracting text from receipt or document images using OCR.space and presenting the results in a clean, styled form.

Source: https://n8n.io/workflows/8506/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

Small businesses, consultants, agencies… anyone who bills with PayPal.

Form, Form Trigger, HTTP Request
Web Scraping

Transform your GLPI system's user experience with a modern, optimized web interface that simplifies technical support ticket creation. How it works

Form Trigger, Form, HTTP Request
Web Scraping

Credentials Transfer. Uses form, httpRequest, executeCommand, readWriteFile. Event-driven trigger; 22 nodes.

Form, HTTP Request, Execute Command +2
Web Scraping

This workflow automates the process of sending voice calls for verification purposes and combines it with email verification. It uses the ClickSend API for voice calls and integrates with SMTP for ema

HTTP Request, Form Trigger, Email Send +1
Web Scraping

This workflow creates a user-friendly web form to upload a file, which allows users to upload a single large file (up to 5Gb) through a custom web form and automatically send it via TransferNow, handl

Form Trigger, HTTP Request, Form