<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Noufal Rijal on Medium]]></title>
        <description><![CDATA[Stories by Noufal Rijal on Medium]]></description>
        <link>https://medium.com/@noufalrijal97?source=rss-964e882c7d0a------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*rbCYmOAoeGme1WVp.jpg</url>
            <title>Stories by Noufal Rijal on Medium</title>
            <link>https://medium.com/@noufalrijal97?source=rss-964e882c7d0a------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 23 May 2026 16:03:28 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@noufalrijal97/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[CDC pipeline using Debezium Server, MySQL, and Amazon Kinesis]]></title>
            <link>https://noufalrijal97.medium.com/cdc-pipeline-using-debezium-server-mysql-and-amazon-kinesis-117b9ca3b764?source=rss-964e882c7d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/117b9ca3b764</guid>
            <dc:creator><![CDATA[Noufal Rijal]]></dc:creator>
            <pubDate>Sun, 11 Jul 2021 13:53:58 GMT</pubDate>
            <atom:updated>2023-04-27T09:32:21.021Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Whenever we work with microservices, the basic principle that revolves around is to have Microservice-specific Databases.</em></p><p><em>Suppose we have a Producer microservice and a Consumer microservice, whenever a new addition happens to the Producer microservices it should be reflected with the Consumer microservice in real-time.</em></p><p><em>So there should be a way of capturing the changes done to the source data system and propagating them to target data systems in a reliable and scalable manner in real-time.</em></p><p><em>And this paves the road for Change Data Capture.</em></p><p>This article will discuss how to capture the changes from the source database and propagate them to the target database using MySQL, Debezium Server, and Amazon Kinesis.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0SFsq5ci5VnFSJ_Q5vb_DQ.jpeg" /><figcaption>This is how it works!</figcaption></figure><h3>Understanding CDC, MySQL Binlogs, Debezium Server and Amazon Kinesis</h3><p>So before we jump into the implementation of this system we will need to understand a few concepts.</p><h4>Change Data Capture</h4><p>Change Data Capture (<a href="https://en.wikipedia.org/wiki/Change_data_capture">CDC</a>) tracks data changes (usually close to real-time). CDC can be implemented for various tasks such as auditing, copying data to another system, or processing (and reacting to) events. In MySQL, the easiest and probably most efficient way to track data changes is to use binary logs.</p><h4>MySQL Binlogs</h4><p>The binary log is a set of log files that contain information about data modifications made to a MySQL server instance.</p><h4>Debezium</h4><ul><li>Debezium is a set of distributed services to capture changes in our databases so that the applications can see those changes and respond to them</li><li>Debezium records all row-level changes within each database table in a <em>change event stream</em>, and applications simply read these streams to see the change events in the same order in which they occurred</li></ul><h4>Debezium Server</h4><ul><li>The Debezium server is a configurable, ready-to-use application that streams change events from a source database to a variety of messaging infrastructures</li><li>Change events can be serialized to different formats like JSON or Apache Avro and then will be sent to one of a variety of messaging infrastructures such as Amazon Kinesis, Google Cloud Pub/Sub, or Apache Pulsar</li><li>For this POC we will be using Amazon Kinesis as the data streaming means</li></ul><h4>Amazon Kinesis</h4><ul><li>Amazon Kinesis Data Streams (KDS) is a massively scalable and durable real-time data streaming service</li><li>We can create data-processing applications, known as Kinesis Data Streams applications</li></ul><h3>Configuration Steps</h3><p>Let’s dive into the tech stack configurations that is needed for this POC. They are as below:</p><h3>1. MySQL</h3><p>Before getting started with CDC in MySQL, we need to enable binary logging. Steps for enabling binary logging :</p><h4>Step 1: Checking the Database Status</h4><p>The first step is to check if the <strong>log-bin</strong> option is turned on or not and what binary log format is used. MySQL provides three types of bin-log formats: ROW, MIXED, and STATEMENT.</p><pre>SHOW VARIABLES LIKE &#39;log_bin&#39;; -- Value should be ON<br>SHOW VARIABLES like &#39;%binlog_format%&#39;; -- Value should be set to ROW</pre><h4>Step 2: Updating the MySQL Configuration File</h4><p>If the log-bin value is OFF from the above query, we need to update the MySQL configuration file (my.conf) by adding the below lines to the [mysqld] section.</p><pre>log-bin=bin.log<br>log-bin-index=bin-log.index<br>max_binlog_size=100M<br>binlog_format=row<br>socket=mysql.sock</pre><p>Once Step 2 is completed, confirm the changes using the queries in Step 1.</p><p>With the above steps, we are all set with the MySQL configurations for CDC.</p><h3>2. Installing and Configuring Debezium Server</h3><h4>Step 1. Install Java</h4><p>Make sure that you have Java installed, if not install Java.</p><pre>apt-get install openjdk-8-jre</pre><h4>Step 2. Install Debezium Server</h4><ul><li>For making this POC we will be using the Debezium server version 1.5.1.Final, download the version using the below command:</li></ul><pre>wget -O debezium.tar.gz<br>&quot;<a href="https://repo1.maven.org/maven2/io/debezium/debezium-server-dist/1.5.1.Final/debezium-server-dist-1.5.1.Final.tar.gz">https://repo1.maven.org/maven2/io/debezium/debezium-server-dist/1.5.1.Final/debezium-server-dist-1.5.1.Final.tar.gz</a>&quot;</pre><ul><li>Unzip the downloaded content to the disk</li></ul><pre>tar -xf debezium.tar.gz </pre><ul><li>A directory named debezium-server will be created with the following contents:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/611/1*Vt04j1IMX7_OIFHkZyGSCw.png" /></figure><h4>Step 3. Configuring the Debezium Server</h4><ul><li>Create a config file called application.properties in the folder conf/</li></ul><pre>touch conf/application.properties</pre><ul><li>Create a new folder called data and add a new file called offsets.dat</li></ul><pre>mkdir data<br>touch data/offsets.dat</pre><ul><li>The new folder structure will be as shown below</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/609/1*eKEKeDnEgDDGUwHJs4YuQg.png" /></figure><ul><li>Now in the application.properties file that we created in the previous step, add the below configurations:</li></ul><pre>debezium.sink.type=kinesis<br>debezium.sink.kinesis.region=us-west-2<br>debezium.sink.kinesis.credentials.profile=default<br>debezium.source.connector.class=io.debezium.connector.mysql.MySqlConnector<br>debezium.source.offset.storage.file.filename=data/offsets.dat<br>debezium.source.offset.flush.interval.ms=0<br>debezium.source.database.hostname=localhost<br>debezium.source.database.port=3306<br>debezium.source.database.user=root<br>debezium.source.database.password=root<br>debezium.source.database.server.name=debezium-tutorial<br>debezium.source.schema.include.list=TestDB<br>debezium.source.table.include.list=TestDB.Orders<br><br>debezium.source.database.history=io.debezium.relational.history.FileDatabaseHistory<br>debezium.source.database.history.file.filename=history.dat</pre><h4>Note:</h4><ol><li><strong>debezium.sink.type</strong>: is for the type of messaging or streaming partner that we use to stream the data. For this POC we are using Amazon Kinesis.</li><li><strong>debezium.sink.kinesis.region</strong>: is the region to which the Kinesis stream is configured with.</li><li><strong>debezium.sink.kinesis.credentials.profile</strong>: is to mention the profile details for which the Kinesis stream is created (only used when we have multiple AWS profiles configured in our system, else it will be the default).</li><li><strong>debezium.source.connector.class</strong>: specifies the type of database management system from which the changes are captured. For this POC we are using a MySQL connector. Connectors for other database management systems are available.</li><li><strong>debezium.source.offset.storage.file.filename: </strong>is the file in which the connector offsets are stored.</li><li><strong>debezium.source.database.dbname: </strong>is the name of the database whose changes are to be captured.</li><li><strong>debezium.source.database.server.name: </strong>is the name of the running debezium server, mainly used while creating streams in Amazon Kinesis.</li><li><strong>debezium.source.table.include.list: </strong>this is the list of table names whose changes are to be captured separated by commas. If this configuration is not provided we need to create streams for all individual tables present within the Database for which the changes are to be captured. The names of the tables should be provided as database_name.table_name . In order to capture the changes from multiple tables the names of the tables have to be provided by separating with commas. For example database_name.table_name1, database_name.table_name2, ......</li><li><strong>debezium.snapshot.new.tables = parallel: </strong>this configuration is used to take snapshots of the newly created tables after the debezium server is configured. If this is not provided then that tables’ changes won’t be captured/snapshotted.</li><li><strong>debezium.source.tombstones.on.delete=false: </strong>This configuration is mainly used to capture the changes made by DELETE queries. Usually, a delete operation is represented by a <em>delete</em> event and a subsequent tombstone event, which causes the server to exit unexpectedly.</li><li><strong>debezium.source.database.history: </strong>Some of the connectors (e.g MySQL, SQL Server, Db2, Oracle) monitor the database schema evolution over time and store the data in database history. io.debezium.relational.history.KafkaDatabaseHistory is the default value for Kafka bases systems. io.debezium.relational.history.FileDatabaseHistory is used for non-Kafka deployments.</li><li><strong>debezium.source.database.history.file.filename: </strong>The name and location of the file to which FileDatabaseHistory persists its data.</li></ol><h3>3. Setting up Amazon Kinesis</h3><h4>Step 1. Creating Kinesis Data Streams</h4><p>We need to create Data Streams for two purposes, they are</p><ol><li>Stream to identify the debezium server which sent the messages, in the same name as provided in debezium.source.database.server.name</li><li>Streams to capture the changes for the individual tables, ie: we have to create Kinesis streams for all the tables listed in debezium.source.table.include.list , the format for creating the streams are:</li></ol><pre>&lt;debezium.source.database.server.name&gt;        -- Stream for Server<br>&lt;debezium.source.database.dbname&gt;.&lt;tablename&gt; -- Stream for tables</pre><p>for example, based on our application.properties file</p><pre>debezium-tutorial                             -- Stream for Server           <br>debezium-tutorial.TestDB.Events               -- Stream for table</pre><p>Steps to create a Kinesis Data Stream</p><ol><li>Go to the Amazon Kinesis page and click Create data stream</li><li>Enter the data stream name</li><li>Add the required number of shards, for out POC 1 shard is enough</li><li>Click create data stream</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/691/1*n30NDCdvqqTq_RZpOyePfw.png" /></figure><p>Similarly, create the necessary streams for the tables provided in debezium.source.table.include.list</p><h4>Step 2. Lambda function to read the streaming data</h4><p>Once the data reaches the Kinesis streams we can process it and can route it to the respective target points.</p><p>Here we will be writing a lambda function that will get triggered based on incoming data streams.</p><p><strong>Steps to create the lambda function:</strong></p><ol><li>Go to the AWS Lambda page and click Create function</li><li>Select “Auther from scratch” and provide the function name and select the Runtime as Python 3.8</li><li>Click Create function</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YSnmht5yVUzjAkUeFjEheQ.png" /></figure><p><strong>Configuring the roles created</strong></p><ol><li>Once lambda function is created go to the configurations tab on the lambda function page</li><li>Choose the Permission tab where we can see the Role that we have created</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pfv8gYY6QgVzxLabWyOj7g.png" /></figure><p>3. Click on the Role name, this will open up the role’s summary page</p><p>4. Click attach policies and add “AmazonKinesisFullAccess”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*z8n4wyPE-lmNGxBuK4_QyQ.png" /></figure><p><strong>Add Triggers</strong></p><ol><li>Go to the configurations tab on the lambda function page</li><li>Choose the Triggers tab where we can add new triggers</li><li>Select Kinesis from the dropdown and add the streams created by us earlier from the Kinesis streams dropdown</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/579/1*Ms6OAMJ5H8x-c9ya6F9xgA.png" /></figure><p><strong>Add code to Lambda Function</strong></p><p>lambda_function.py</p><pre>import base64<br>import json<br>import boto3<br><br># simple lambda function to retrieve the data from Kinesis Data Stream<br># in order to send the data to the respective target DB&#39;s ..<br># make the necessary connections<br><br>def lambda_handler(event, context):<br>    kinesis = boto3.client(&#39;kinesis&#39;)<br>    for record in event[&#39;Records&#39;]:<br>        payload = base64.b64decode(record[&#39;kinesis&#39;][&#39;data&#39;]).decode(&#39;utf-8&#39;)<br>        data = json.loads(payload)<br>        # do something with the data<br>        print(data)<br>    return &#39;Successfully processed {} records.&#39;.format(len(event[&#39;Records&#39;]))</pre><p>Now we are ready to go with the testing…</p><h3>Testing the CDC Pipeline</h3><ol><li>Create a database called TestDB</li></ol><pre>Create database TestDB;</pre><p>2. Create a test table called Events</p><pre>create table `TestDB`.`Events` (<br>  `Id` int not null,<br>  `EventName` varchar(150) null,<br>  `EventDate` datetime null,<br>  primary key(`Id`));</pre><p>3. Start the Debezium server from the debezium-server folder using</p><pre>sh run.sh</pre><p>4. Once the server is up, we can start doing INSERT, UPDATE, DELETE operations to the table created :</p><pre>Insert into Events values (1,&#39;Test&#39;,CurDate());<br>Update Events set EventName = &quot;updated test&quot; where Id=1;<br>Delete from Events where Id=1;</pre><p>We can check the data received at the Kinesis stream by checking the cloudwatch logs.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/933aaecb93f9c605ad3ffb08ffbb01e4/href">https://medium.com/media/933aaecb93f9c605ad3ffb08ffbb01e4/href</a></iframe><p>Similarly, we will be receiving data streams with op values as u and d respectively for UPDATE and DELETE operations.</p><p>The received data can then be routed to the required target databases based on our requirements.</p><h3>References</h3><ul><li><a href="https://debezium.io/documentation/reference/1.5/operations/debezium-server.html">Debezium Server</a></li><li><a href="https://debezium.io/documentation/reference/1.5/connectors/mysql.html">Debezium connector for MySQL</a></li><li><a href="https://repo1.maven.org/maven2/io/debezium/debezium-server-dist/1.5.1.Final/">io/debezium/debezium-server-dist/1.5.1.Final</a></li><li><a href="https://aws.amazon.com/kinesis/data-streams/">Real-Time Streaming Analytics - Amazon Kinesis Data Streams - AWS</a></li></ul><p><em>Hope the content was informative! :)</em></p><p><em>Noufal Rijal</em></p><p><a href="https://www.linkedin.com/in/noufalrijal">Noufal Rijal - Software Development Engineer - InApp | LinkedIn</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=117b9ca3b764" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Extracting Data points as JSON from a Handwritten form using — AWS Textract, Lamba and S3]]></title>
            <link>https://noufalrijal97.medium.com/extracting-data-points-as-json-from-a-handwritten-form-using-aws-textract-lamba-and-s3-a20630def4bd?source=rss-964e882c7d0a------2</link>
            <guid isPermaLink="false">https://medium.com/p/a20630def4bd</guid>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[ocr]]></category>
            <category><![CDATA[aws-textract]]></category>
            <category><![CDATA[json]]></category>
            <dc:creator><![CDATA[Noufal Rijal]]></dc:creator>
            <pubDate>Fri, 16 Apr 2021 12:02:23 GMT</pubDate>
            <atom:updated>2021-12-22T14:44:57.092Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Extracting Data points as JSON from Handwritten forms using — AWS Textract, Lambda and S3</strong></h3><p><em>The winter storms in Texas in 2021 have made our client come up with a use case that helps them collect data from users through handwritten paper form, and save the data points to our existing database tables.</em></p><p><em>As developers, this was a new challenge and an opportunity to learn and try new technology stacks.</em></p><p><em>After a good round of research, we finalized to use the OCR service provided by AWS called “Textract”.</em></p><p><em>When we were working on it we couldn’t find many resources which could guide us to work with these services, so I on behalf of our team thought of documenting and publishing our journey…</em></p><p>Amazon Textract is a machine learning service that automatically extracts text, handwriting, and data from scanned documents that goes beyond simple optical character recognition (OCR) to identify, understand, and extract data from forms and tables.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*rFlJNSNMZwZw48_8TLKr7w.png" /><figcaption>This is how it works!</figcaption></figure><h4>In this post we will be covering the following checkpoints:</h4><p>1. How to upload image/document to S3 bucket</p><p>2. How to create a Lambda function that gets triggered when a new image or doc is uploaded in S3</p><p>3. How to write python code in lambda function which will help in parsing the analyzed text/data from doc/image and provide a JSON output</p><p>4. Creating a new response JSON file whenever a new image/doc is uploaded to s3</p><h3>Prerequisites</h3><p>1. You need to have an AWS account and some basic knowledge of AWS services.</p><p>2. To use AWS Textract in Python, the latest “boto3” package is needed which is not currently available in AWS Lambda hosted environments. Execute this command: pip install — target ./python boto3</p><p>3. You should have created essential credentials like Access Key and Secret Key on your account.</p><p>4. Following AWS services will be utilized throughout this guide</p><ul><li>Lambda Service</li><li>Textract Service</li><li>Simple Storage Service i.e. S3</li><li>Identity Access Management Service</li></ul><h3>1. Uploading Image/doc to S3 bucket</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/784/1*g3alJ1GQ5abkRv6OCRaT0Q.png" /><figcaption>A process overview</figcaption></figure><h4>Create S3 Bucket</h4><p>1. Go to AWS S3 page and click Create Bucket</p><p>2. Enter the Bucket name and Region click Next</p><p>3. Set permissions and click Create Bucket</p><p><em>Note</em>:- <em>The region selected should be the same as the one used to create the Lambda function</em></p><h4><strong>Upload image to S3 bucket</strong></h4><p>For this example, we are trying to upload images directly from the AWS S3 bucket console.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/901/1*6oo1zmWAJjXr2J-IgI94oQ.png" /></figure><h3>2. Extracting data from an S3 image</h3><p>This process consists of a Lambda function that gets triggered whenever an image (.jpg extension) gets uploaded to the S3 bucket.</p><p>Follow the steps below</p><p><strong>Creating the S3 Lambda Trigger</strong></p><p>Steps to create a Lambda function that gets triggered whenever an image is uploaded</p><p>1. Go to AWS Lambda page and click Create function</p><p>2. Select “Use a Blueprint” and search for “s3-get-object-python” template and click “configure”</p><p>3. Enter the function name, role name</p><p>4. For creating the S3 trigger under the S3 trigger tab:</p><ul><li>Add the bucket name</li><li>Select all object to create events for Event type</li><li>Suffix as .jpg</li></ul><p>5. Click create function</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/676/1*MHSEOvN7FFv8wSzgN6Ct_A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/676/1*kpmxR0y31itOriv6-pl6aw.png" /></figure><p><em>Note:- We can add more than one triggers for PNG, PDF files based on our needs</em></p><p><strong>Configuring the roles created</strong></p><p>1. Once lambda function is created go to the configurations tab on the lambda function page</p><p>2. Choose the Permission tab where we can see the Role that we have created</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Rz1vBVRVSTr0jboycm2YnQ.png" /></figure><p>3. Click on the Role name, this will open up the role’s summary page</p><p>4. Click attach policies and add “AmazonTextractFullAccess”, this will give the lambda function to access the AWS Textract service</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FZ6f5BOz0eIqIJVP694lZA.png" /></figure><p><strong>Add Layers to Lambda function</strong></p><p><strong>Step 1- Creating the boto3 zip</strong></p><ol><li>In the local machine create a directory for the project</li></ol><pre>mkdir -p zip_boto3/python</pre><p>2. Install boto3 package in to boto3/python directory</p><pre>Pip install boto3</pre><p>3. Zip the contents of boto3</p><pre>cd zip_boto3</pre><pre>zip -r boto3-layer.zip python</pre><p><strong>Step 2- Creating layer in AWS</strong></p><p>1. Log in to AWS console and go to lambda</p><p>2. Select layers and click create a layer</p><p>3. Fill in the details for the layer and select Python 3.7 as the compatible runtime</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/889/1*q2Kil-C8lr_4aDn1qQr81w.png" /></figure><p><strong>Step 3-Using the layer</strong></p><p>1. Select the lambda function that we have created</p><p>2. Click on Layers and then Add a layer</p><p>3. Pick the layer that we have created and save the lambda function</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/798/1*8kmu2YBUxsOBacqBC-_MhQ.png" /></figure><h3>3. Add code to Lambda Function</h3><p>Create two files in your function folder</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JD8CzEf4eE5iiJ7-j_I7Mg.png" /></figure><p>lambda_function.py</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9e718729348a36c798fdcb2ca762382a/href">https://medium.com/media/9e718729348a36c798fdcb2ca762382a/href</a></iframe><p><em>Note</em>:- <em>The above code snippet will help in capturing the table data from the uploaded file, and returns a JSON file with the table contents specified by the column name</em></p><p>trp.py</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/607191719dedc6cd556ee07d7ae8b3c2/href">https://medium.com/media/607191719dedc6cd556ee07d7ae8b3c2/href</a></iframe><p><strong>Save and test your Lambda function</strong></p><h3>4. Result</h3><p>Whenever an object with .JPG extension is uploaded to the S3 Bucket the associated lambda function will get triggered and an output file with .JSON extension will be generated back to S3 Bucket.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KQuqnfEt-KBhGsFaqVpIPQ.png" /><figcaption>Generated JSON file in S3 Bucket</figcaption></figure><h3>5. References</h3><ul><li><a href="https://aws.amazon.com/blogs/machine-learning/automatically-extract-text-and-structured-data-from-documents-with-amazon-textract/">Automatically extract text and structured data from documents with Amazon Textract | Amazon Web Services</a></li><li><a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html">Working with object metadata</a></li><li><a href="https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/textract.html#Textract.Client.detect_document_text">Textract - Boto3 Docs 1.20.25 documentation</a></li><li><a href="https://pypi.org/project/amazon-textract-response-parser/">amazon-textract-response-parser</a></li><li><a href="https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/textract.html#Textract.Client.detect_document_text">Textract - Boto3 Docs 1.20.25 documentation</a></li></ul><p><em>Hope the content was informative! :)</em></p><p>-<em>Noufal Rijal</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a20630def4bd" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>