Repository: aws-samples/amazon-textract-idp-cdk-constructs (language: python)

Issue:
feat: Adding support for Healthlake
Added #PDF to FHIR mapper where PDF documents processed by Textract are ingested in Healthlake
feat: Adding support for Healthlake
Added #PDF to FHIR mapper where PDF documents processed by Textract are ingested in Healthlake


Discussion / hints:

Fix patch:
diff --git a/API.md b/API.md
index 69c9fb9..559e112 100644
--- a/API.md
+++ b/API.md
@@ -1519,222 +1519,6 @@ public readonly lambdaSecurityGroup: ISecurityGroup;
 ---
 
 
-### SearchablePDF <a name="SearchablePDF" id="amazon-textract-idp-cdk-constructs.SearchablePDF"></a>
-
-This construct takes in a JSON with two s3 Paths, s3TextractOutput, s3PDFBucket.
-
-example s3Path:
-{"s3TextractOutput": "s3://bucketname/prefix/1"}
-{"s3PDFBucket": "s3://bucketname/prefix/document.pdf"}
-```
-
-#### Initializers <a name="Initializers" id="amazon-textract-idp-cdk-constructs.SearchablePDF.Initializer"></a>
-
-```typescript
-import { SearchablePDF } from 'amazon-textract-idp-cdk-constructs'
-
-new SearchablePDF(parent: Construct, id: string, props: SearchablePDFProps)
-```
-
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.Initializer.parameter.parent">parent</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.Initializer.parameter.props">props</a></code> | <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps">SearchablePDFProps</a></code> | *No description.* |
-
----
-
-##### `parent`<sup>Required</sup> <a name="parent" id="amazon-textract-idp-cdk-constructs.SearchablePDF.Initializer.parameter.parent"></a>
-
-- *Type:* constructs.Construct
-
----
-
-##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.SearchablePDF.Initializer.parameter.id"></a>
-
-- *Type:* string
-
----
-
-##### `props`<sup>Required</sup> <a name="props" id="amazon-textract-idp-cdk-constructs.SearchablePDF.Initializer.parameter.props"></a>
-
-- *Type:* <a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps">SearchablePDFProps</a>
-
----
-
-#### Methods <a name="Methods" id="Methods"></a>
-
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.next">next</a></code> | Continue normal execution with the given state. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.prefixStates">prefixStates</a></code> | Prefix the IDs of all states in this state machine fragment. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.toSingleState">toSingleState</a></code> | Wrap all states in this state machine fragment up into a single state. |
-
----
-
-##### `toString` <a name="toString" id="amazon-textract-idp-cdk-constructs.SearchablePDF.toString"></a>
-
-```typescript
-public toString(): string
-```
-
-Returns a string representation of this construct.
-
-##### `next` <a name="next" id="amazon-textract-idp-cdk-constructs.SearchablePDF.next"></a>
-
-```typescript
-public next(next: IChainable): Chain
-```
-
-Continue normal execution with the given state.
-
-###### `next`<sup>Required</sup> <a name="next" id="amazon-textract-idp-cdk-constructs.SearchablePDF.next.parameter.next"></a>
-
-- *Type:* aws-cdk-lib.aws_stepfunctions.IChainable
-
----
-
-##### `prefixStates` <a name="prefixStates" id="amazon-textract-idp-cdk-constructs.SearchablePDF.prefixStates"></a>
-
-```typescript
-public prefixStates(prefix?: string): StateMachineFragment
-```
-
-Prefix the IDs of all states in this state machine fragment.
-
-Use this to avoid multiple copies of the state machine all having the
-same state IDs.
-
-###### `prefix`<sup>Optional</sup> <a name="prefix" id="amazon-textract-idp-cdk-constructs.SearchablePDF.prefixStates.parameter.prefix"></a>
-
-- *Type:* string
-
-The prefix to add.
-
-Will use construct ID by default.
-
----
-
-##### `toSingleState` <a name="toSingleState" id="amazon-textract-idp-cdk-constructs.SearchablePDF.toSingleState"></a>
-
-```typescript
-public toSingleState(options?: SingleStateOptions): Parallel
-```
-
-Wrap all states in this state machine fragment up into a single state.
-
-This can be used to add retry or error handling onto this state
-machine fragment.
-
-Be aware that this changes the result of the inner state machine
-to be an array with the result of the state machine in it. Adjust
-your paths accordingly. For example, change 'outputPath' to
-'$[0]'.
-
-###### `options`<sup>Optional</sup> <a name="options" id="amazon-textract-idp-cdk-constructs.SearchablePDF.toSingleState.parameter.options"></a>
-
-- *Type:* aws-cdk-lib.aws_stepfunctions.SingleStateOptions
-
----
-
-#### Static Functions <a name="Static Functions" id="Static Functions"></a>
-
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
-
----
-
-##### ~~`isConstruct`~~ <a name="isConstruct" id="amazon-textract-idp-cdk-constructs.SearchablePDF.isConstruct"></a>
-
-```typescript
-import { SearchablePDF } from 'amazon-textract-idp-cdk-constructs'
-
-SearchablePDF.isConstruct(x: any)
-```
-
-Checks if `x` is a construct.
-
-###### `x`<sup>Required</sup> <a name="x" id="amazon-textract-idp-cdk-constructs.SearchablePDF.isConstruct.parameter.x"></a>
-
-- *Type:* any
-
-Any object.
-
----
-
-#### Properties <a name="Properties" id="Properties"></a>
-
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.property.endStates">endStates</a></code> | <code>aws-cdk-lib.aws_stepfunctions.INextable[]</code> | The states to chain onto if this fragment is used. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.property.id">id</a></code> | <code>string</code> | Descriptive identifier for this chainable. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.property.startState">startState</a></code> | <code>aws-cdk-lib.aws_stepfunctions.State</code> | The start state of this state machine fragment. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDF.property.searchablePDFFunction">searchablePDFFunction</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
-
----
-
-##### `node`<sup>Required</sup> <a name="node" id="amazon-textract-idp-cdk-constructs.SearchablePDF.property.node"></a>
-
-```typescript
-public readonly node: Node;
-```
-
-- *Type:* constructs.Node
-
-The tree node.
-
----
-
-##### `endStates`<sup>Required</sup> <a name="endStates" id="amazon-textract-idp-cdk-constructs.SearchablePDF.property.endStates"></a>
-
-```typescript
-public readonly endStates: INextable[];
-```
-
-- *Type:* aws-cdk-lib.aws_stepfunctions.INextable[]
-
-The states to chain onto if this fragment is used.
-
----
-
-##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.SearchablePDF.property.id"></a>
-
-```typescript
-public readonly id: string;
-```
-
-- *Type:* string
-
-Descriptive identifier for this chainable.
-
----
-
-##### `startState`<sup>Required</sup> <a name="startState" id="amazon-textract-idp-cdk-constructs.SearchablePDF.property.startState"></a>
-
-```typescript
-public readonly startState: State;
-```
-
-- *Type:* aws-cdk-lib.aws_stepfunctions.State
-
-The start state of this state machine fragment.
-
----
-
-##### `searchablePDFFunction`<sup>Required</sup> <a name="searchablePDFFunction" id="amazon-textract-idp-cdk-constructs.SearchablePDF.property.searchablePDFFunction"></a>
-
-```typescript
-public readonly searchablePDFFunction: IFunction;
-```
-
-- *Type:* aws-cdk-lib.aws_lambda.IFunction
-
----
-
-
 ### SpacySfnTask <a name="SpacySfnTask" id="amazon-textract-idp-cdk-constructs.SpacySfnTask"></a>
 
 Deploys a Lambda Container with a Spacy NLP model to call textcat.
@@ -5153,7 +4937,7 @@ public readonly syncTimedOutMetric: IMetric;
 ---
 
 
-### TextractPOCDecider <a name="TextractPOCDecider" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider"></a>
+### TextractPdfMapperForFhir <a name="TextractPdfMapperForFhir" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir"></a>
 
 This construct takes in a manifest definition or a plain JSON with a s3Path:.
 
@@ -5167,42 +4951,42 @@ The mime types checked against the supported mime types for Textract and if fail
 Example (Python)
 ```python
 decider_task_id = tcdk.TextractPOCDecider(
-      self,
-      f"InsuranceDecider",
+self,
+f"InsuranceDecider",
 )
 ```
 
-#### Initializers <a name="Initializers" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer"></a>
+#### Initializers <a name="Initializers" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.Initializer"></a>
 
 ```typescript
-import { TextractPOCDecider } from 'amazon-textract-idp-cdk-constructs'
+import { TextractPdfMapperForFhir } from 'amazon-textract-idp-cdk-constructs'
 
-new TextractPOCDecider(parent: Construct, id: string, props: TextractDPPOCDeciderProps)
+new TextractPdfMapperForFhir(parent: Construct, id: string, props: TextractPdfMapperForFhirProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.parent">parent</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.props">props</a></code> | <code><a href="#amazon-textract-idp-cdk-constructs.TextractDPPOCDeciderProps">TextractDPPOCDeciderProps</a></code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.Initializer.parameter.parent">parent</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.Initializer.parameter.props">props</a></code> | <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps">TextractPdfMapperForFhirProps</a></code> | *No description.* |
 
 ---
 
-##### `parent`<sup>Required</sup> <a name="parent" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.parent"></a>
+##### `parent`<sup>Required</sup> <a name="parent" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.Initializer.parameter.parent"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.id"></a>
+##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.Initializer.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.props"></a>
+##### `props`<sup>Required</sup> <a name="props" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.Initializer.parameter.props"></a>
 
-- *Type:* <a href="#amazon-textract-idp-cdk-constructs.TextractDPPOCDeciderProps">TextractDPPOCDeciderProps</a>
+- *Type:* <a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps">TextractPdfMapperForFhirProps</a>
 
 ---
 
@@ -5210,14 +4994,14 @@ new TextractPOCDecider(parent: Construct, id: string, props: TextractDPPOCDecide
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.next">next</a></code> | Continue normal execution with the given state. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.prefixStates">prefixStates</a></code> | Prefix the IDs of all states in this state machine fragment. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.toSingleState">toSingleState</a></code> | Wrap all states in this state machine fragment up into a single state. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.next">next</a></code> | Continue normal execution with the given state. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.prefixStates">prefixStates</a></code> | Prefix the IDs of all states in this state machine fragment. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.toSingleState">toSingleState</a></code> | Wrap all states in this state machine fragment up into a single state. |
 
 ---
 
-##### `toString` <a name="toString" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.toString"></a>
+##### `toString` <a name="toString" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.toString"></a>
 
 ```typescript
 public toString(): string
@@ -5225,7 +5009,7 @@ public toString(): string
 
 Returns a string representation of this construct.
 
-##### `next` <a name="next" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.next"></a>
+##### `next` <a name="next" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.next"></a>
 
 ```typescript
 public next(next: IChainable): Chain
@@ -5233,13 +5017,13 @@ public next(next: IChainable): Chain
 
 Continue normal execution with the given state.
 
-###### `next`<sup>Required</sup> <a name="next" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.next.parameter.next"></a>
+###### `next`<sup>Required</sup> <a name="next" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.next.parameter.next"></a>
 
 - *Type:* aws-cdk-lib.aws_stepfunctions.IChainable
 
 ---
 
-##### `prefixStates` <a name="prefixStates" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.prefixStates"></a>
+##### `prefixStates` <a name="prefixStates" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.prefixStates"></a>
 
 ```typescript
 public prefixStates(prefix?: string): StateMachineFragment
@@ -5250,7 +5034,7 @@ Prefix the IDs of all states in this state machine fragment.
 Use this to avoid multiple copies of the state machine all having the
 same state IDs.
 
-###### `prefix`<sup>Optional</sup> <a name="prefix" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.prefixStates.parameter.prefix"></a>
+###### `prefix`<sup>Optional</sup> <a name="prefix" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.prefixStates.parameter.prefix"></a>
 
 - *Type:* string
 
@@ -5260,7 +5044,7 @@ Will use construct ID by default.
 
 ---
 
-##### `toSingleState` <a name="toSingleState" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.toSingleState"></a>
+##### `toSingleState` <a name="toSingleState" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.toSingleState"></a>
 
 ```typescript
 public toSingleState(options?: SingleStateOptions): Parallel
@@ -5276,7 +5060,7 @@ to be an array with the result of the state machine in it. Adjust
 your paths accordingly. For example, change 'outputPath' to
 '$[0]'.
 
-###### `options`<sup>Optional</sup> <a name="options" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.toSingleState.parameter.options"></a>
+###### `options`<sup>Optional</sup> <a name="options" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.toSingleState.parameter.options"></a>
 
 - *Type:* aws-cdk-lib.aws_stepfunctions.SingleStateOptions
 
@@ -5286,21 +5070,21 @@ your paths accordingly. For example, change 'outputPath' to
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
 
 ---
 
-##### ~~`isConstruct`~~ <a name="isConstruct" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.isConstruct"></a>
+##### ~~`isConstruct`~~ <a name="isConstruct" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.isConstruct"></a>
 
 ```typescript
-import { TextractPOCDecider } from 'amazon-textract-idp-cdk-constructs'
+import { TextractPdfMapperForFhir } from 'amazon-textract-idp-cdk-constructs'
 
-TextractPOCDecider.isConstruct(x: any)
+TextractPdfMapperForFhir.isConstruct(x: any)
 ```
 
 Checks if `x` is a construct.
 
-###### `x`<sup>Required</sup> <a name="x" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.isConstruct.parameter.x"></a>
+###### `x`<sup>Required</sup> <a name="x" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.isConstruct.parameter.x"></a>
 
 - *Type:* any
 
@@ -5312,15 +5096,15 @@ Any object.
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.endStates">endStates</a></code> | <code>aws-cdk-lib.aws_stepfunctions.INextable[]</code> | The states to chain onto if this fragment is used. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.id">id</a></code> | <code>string</code> | Descriptive identifier for this chainable. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.startState">startState</a></code> | <code>aws-cdk-lib.aws_stepfunctions.State</code> | The start state of this state machine fragment. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.deciderFunction">deciderFunction</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.endStates">endStates</a></code> | <code>aws-cdk-lib.aws_stepfunctions.INextable[]</code> | The states to chain onto if this fragment is used. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.id">id</a></code> | <code>string</code> | Descriptive identifier for this chainable. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.startState">startState</a></code> | <code>aws-cdk-lib.aws_stepfunctions.State</code> | The start state of this state machine fragment. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.pdfMapperForFhirFunction">pdfMapperForFhirFunction</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.node"></a>
+##### `node`<sup>Required</sup> <a name="node" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.node"></a>
 
 ```typescript
 public readonly node: Node;
@@ -5332,7 +5116,7 @@ The tree node.
 
 ---
 
-##### `endStates`<sup>Required</sup> <a name="endStates" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.endStates"></a>
+##### `endStates`<sup>Required</sup> <a name="endStates" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.endStates"></a>
 
 ```typescript
 public readonly endStates: INextable[];
@@ -5344,7 +5128,7 @@ The states to chain onto if this fragment is used.
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.id"></a>
+##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.id"></a>
 
 ```typescript
 public readonly id: string;
@@ -5356,7 +5140,7 @@ Descriptive identifier for this chainable.
 
 ---
 
-##### `startState`<sup>Required</sup> <a name="startState" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.startState"></a>
+##### `startState`<sup>Required</sup> <a name="startState" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.startState"></a>
 
 ```typescript
 public readonly startState: State;
@@ -5368,10 +5152,10 @@ The start state of this state machine fragment.
 
 ---
 
-##### `deciderFunction`<sup>Required</sup> <a name="deciderFunction" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.deciderFunction"></a>
+##### `pdfMapperForFhirFunction`<sup>Required</sup> <a name="pdfMapperForFhirFunction" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhir.property.pdfMapperForFhirFunction"></a>
 
 ```typescript
-public readonly deciderFunction: IFunction;
+public readonly pdfMapperForFhirFunction: IFunction;
 ```
 
 - *Type:* aws-cdk-lib.aws_lambda.IFunction
@@ -5379,39 +5163,56 @@ public readonly deciderFunction: IFunction;
 ---
 
 
-### WorkmailS3IngestionPoint <a name="WorkmailS3IngestionPoint" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint"></a>
+### TextractPOCDecider <a name="TextractPOCDecider" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider"></a>
 
-#### Initializers <a name="Initializers" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer"></a>
+This construct takes in a manifest definition or a plain JSON with a s3Path:.
+
+example s3Path:
+{"s3Path": "s3://bucketname/prefix/image.png"}
+
+
+Then it generated the numberOfPages attribute and the mime on the context.
+The mime types checked against the supported mime types for Textract and if fails, will raise an Exception failing the workflow.
+
+Example (Python)
+```python
+decider_task_id = tcdk.TextractPOCDecider(
+      self,
+      f"InsuranceDecider",
+)
+```
+
+#### Initializers <a name="Initializers" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer"></a>
 
 ```typescript
-import { WorkmailS3IngestionPoint } from 'amazon-textract-idp-cdk-constructs'
+import { TextractPOCDecider } from 'amazon-textract-idp-cdk-constructs'
 
-new WorkmailS3IngestionPoint(scope: Construct, id: string, props: WorkmailS3IngestionPointProps)
+new TextractPOCDecider(parent: Construct, id: string, props: TextractDPPOCDeciderProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.props">props</a></code> | <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPointProps">WorkmailS3IngestionPointProps</a></code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.parent">parent</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.props">props</a></code> | <code><a href="#amazon-textract-idp-cdk-constructs.TextractDPPOCDeciderProps">TextractDPPOCDeciderProps</a></code> | *No description.* |
 
 ---
 
-##### `scope`<sup>Required</sup> <a name="scope" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.scope"></a>
+##### `parent`<sup>Required</sup> <a name="parent" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.parent"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.id"></a>
+##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.props"></a>
+##### `props`<sup>Required</sup> <a name="props" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.Initializer.parameter.props"></a>
 
-- *Type:* <a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPointProps">WorkmailS3IngestionPointProps</a>
+- *Type:* <a href="#amazon-textract-idp-cdk-constructs.TextractDPPOCDeciderProps">TextractDPPOCDeciderProps</a>
 
 ---
 
@@ -5419,8 +5220,217 @@ new WorkmailS3IngestionPoint(scope: Construct, id: string, props: WorkmailS3Inge
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.toString">toString</a></code> | Returns a string representation of this construct. |
-
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.next">next</a></code> | Continue normal execution with the given state. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.prefixStates">prefixStates</a></code> | Prefix the IDs of all states in this state machine fragment. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.toSingleState">toSingleState</a></code> | Wrap all states in this state machine fragment up into a single state. |
+
+---
+
+##### `toString` <a name="toString" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.toString"></a>
+
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+##### `next` <a name="next" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.next"></a>
+
+```typescript
+public next(next: IChainable): Chain
+```
+
+Continue normal execution with the given state.
+
+###### `next`<sup>Required</sup> <a name="next" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.next.parameter.next"></a>
+
+- *Type:* aws-cdk-lib.aws_stepfunctions.IChainable
+
+---
+
+##### `prefixStates` <a name="prefixStates" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.prefixStates"></a>
+
+```typescript
+public prefixStates(prefix?: string): StateMachineFragment
+```
+
+Prefix the IDs of all states in this state machine fragment.
+
+Use this to avoid multiple copies of the state machine all having the
+same state IDs.
+
+###### `prefix`<sup>Optional</sup> <a name="prefix" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.prefixStates.parameter.prefix"></a>
+
+- *Type:* string
+
+The prefix to add.
+
+Will use construct ID by default.
+
+---
+
+##### `toSingleState` <a name="toSingleState" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.toSingleState"></a>
+
+```typescript
+public toSingleState(options?: SingleStateOptions): Parallel
+```
+
+Wrap all states in this state machine fragment up into a single state.
+
+This can be used to add retry or error handling onto this state
+machine fragment.
+
+Be aware that this changes the result of the inner state machine
+to be an array with the result of the state machine in it. Adjust
+your paths accordingly. For example, change 'outputPath' to
+'$[0]'.
+
+###### `options`<sup>Optional</sup> <a name="options" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.toSingleState.parameter.options"></a>
+
+- *Type:* aws-cdk-lib.aws_stepfunctions.SingleStateOptions
+
+---
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+
+---
+
+##### ~~`isConstruct`~~ <a name="isConstruct" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.isConstruct"></a>
+
+```typescript
+import { TextractPOCDecider } from 'amazon-textract-idp-cdk-constructs'
+
+TextractPOCDecider.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+###### `x`<sup>Required</sup> <a name="x" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.isConstruct.parameter.x"></a>
+
+- *Type:* any
+
+Any object.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.endStates">endStates</a></code> | <code>aws-cdk-lib.aws_stepfunctions.INextable[]</code> | The states to chain onto if this fragment is used. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.id">id</a></code> | <code>string</code> | Descriptive identifier for this chainable. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.startState">startState</a></code> | <code>aws-cdk-lib.aws_stepfunctions.State</code> | The start state of this state machine fragment. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.deciderFunction">deciderFunction</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `endStates`<sup>Required</sup> <a name="endStates" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.endStates"></a>
+
+```typescript
+public readonly endStates: INextable[];
+```
+
+- *Type:* aws-cdk-lib.aws_stepfunctions.INextable[]
+
+The states to chain onto if this fragment is used.
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.id"></a>
+
+```typescript
+public readonly id: string;
+```
+
+- *Type:* string
+
+Descriptive identifier for this chainable.
+
+---
+
+##### `startState`<sup>Required</sup> <a name="startState" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.startState"></a>
+
+```typescript
+public readonly startState: State;
+```
+
+- *Type:* aws-cdk-lib.aws_stepfunctions.State
+
+The start state of this state machine fragment.
+
+---
+
+##### `deciderFunction`<sup>Required</sup> <a name="deciderFunction" id="amazon-textract-idp-cdk-constructs.TextractPOCDecider.property.deciderFunction"></a>
+
+```typescript
+public readonly deciderFunction: IFunction;
+```
+
+- *Type:* aws-cdk-lib.aws_lambda.IFunction
+
+---
+
+
+### WorkmailS3IngestionPoint <a name="WorkmailS3IngestionPoint" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint"></a>
+
+#### Initializers <a name="Initializers" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer"></a>
+
+```typescript
+import { WorkmailS3IngestionPoint } from 'amazon-textract-idp-cdk-constructs'
+
+new WorkmailS3IngestionPoint(scope: Construct, id: string, props: WorkmailS3IngestionPointProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.props">props</a></code> | <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPointProps">WorkmailS3IngestionPointProps</a></code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.Initializer.parameter.props"></a>
+
+- *Type:* <a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPointProps">WorkmailS3IngestionPointProps</a>
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.toString">toString</a></code> | Returns a string representation of this construct. |
+
 ---
 
 ##### `toString` <a name="toString" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPoint.toString"></a>
@@ -6393,108 +6403,6 @@ VPC to install the database into.
 
 ---
 
-### SearchablePDFProps <a name="SearchablePDFProps" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps"></a>
-
-#### Initializer <a name="Initializer" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.Initializer"></a>
-
-```typescript
-import { SearchablePDFProps } from 'amazon-textract-idp-cdk-constructs'
-
-const searchablePDFProps: SearchablePDFProps = { ... }
-```
-
-#### Properties <a name="Properties" id="Properties"></a>
-
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.inputPolicyStatements">inputPolicyStatements</a></code> | <code>object</code> | List of PolicyStatements to attach to the Lambda function for S3 GET and LIST. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.lambdaMemoryMB">lambdaMemoryMB</a></code> | <code>number</code> | memory of Lambda function (may need to increase for larger documents). |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.lambdaTimeout">lambdaTimeout</a></code> | <code>number</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.s3InputPrefix">s3InputPrefix</a></code> | <code>string</code> | prefix for the incoming document. |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.s3PDFBucket">s3PDFBucket</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.s3TextractOutputBucket">s3TextractOutputBucket</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.searchablePDFFunction">searchablePDFFunction</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
-
----
-
-##### `inputPolicyStatements`<sup>Optional</sup> <a name="inputPolicyStatements" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.inputPolicyStatements"></a>
-
-```typescript
-public readonly inputPolicyStatements: object;
-```
-
-- *Type:* object
-
-List of PolicyStatements to attach to the Lambda function for S3 GET and LIST.
-
----
-
-##### `lambdaMemoryMB`<sup>Optional</sup> <a name="lambdaMemoryMB" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.lambdaMemoryMB"></a>
-
-```typescript
-public readonly lambdaMemoryMB: number;
-```
-
-- *Type:* number
-
-memory of Lambda function (may need to increase for larger documents).
-
----
-
-##### `lambdaTimeout`<sup>Optional</sup> <a name="lambdaTimeout" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.lambdaTimeout"></a>
-
-```typescript
-public readonly lambdaTimeout: number;
-```
-
-- *Type:* number
-
----
-
-##### `s3InputPrefix`<sup>Optional</sup> <a name="s3InputPrefix" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.s3InputPrefix"></a>
-
-```typescript
-public readonly s3InputPrefix: string;
-```
-
-- *Type:* string
-
-prefix for the incoming document.
-
-Will be used to create role
-
----
-
-##### `s3PDFBucket`<sup>Optional</sup> <a name="s3PDFBucket" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.s3PDFBucket"></a>
-
-```typescript
-public readonly s3PDFBucket: string;
-```
-
-- *Type:* string
-
----
-
-##### `s3TextractOutputBucket`<sup>Optional</sup> <a name="s3TextractOutputBucket" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.s3TextractOutputBucket"></a>
-
-```typescript
-public readonly s3TextractOutputBucket: string;
-```
-
-- *Type:* string
-
----
-
-##### `searchablePDFFunction`<sup>Optional</sup> <a name="searchablePDFFunction" id="amazon-textract-idp-cdk-constructs.SearchablePDFProps.property.searchablePDFFunction"></a>
-
-```typescript
-public readonly searchablePDFFunction: IFunction;
-```
-
-- *Type:* aws-cdk-lib.aws_lambda.IFunction
-
----
-
 ### SpacySfnTaskProps <a name="SpacySfnTaskProps" id="amazon-textract-idp-cdk-constructs.SpacySfnTaskProps"></a>
 
 #### Initializer <a name="Initializer" id="amazon-textract-idp-cdk-constructs.SpacySfnTaskProps.Initializer"></a>
@@ -8510,6 +8418,119 @@ public readonly workflowTracingEnabled: boolean;
 
 ---
 
+### TextractPdfMapperForFhirProps <a name="TextractPdfMapperForFhirProps" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps"></a>
+
+#### Initializer <a name="Initializer" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.Initializer"></a>
+
+```typescript
+import { TextractPdfMapperForFhirProps } from 'amazon-textract-idp-cdk-constructs'
+
+const textractPdfMapperForFhirProps: TextractPdfMapperForFhirProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.healthlakeEndpoint">healthlakeEndpoint</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.inputPolicyStatements">inputPolicyStatements</a></code> | <code>object</code> | List of PolicyStatements to attach to the Lambda function for S3 GET and LIST. |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.lambdaLogLevel">lambdaLogLevel</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.lambdaMemoryMB">lambdaMemoryMB</a></code> | <code>number</code> | memory of Lambda function (may need to increase for larger documents). |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.lambdaTimeout">lambdaTimeout</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.pdfMapperForFhirFunction">pdfMapperForFhirFunction</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.s3InputBucket">s3InputBucket</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.s3InputPrefix">s3InputPrefix</a></code> | <code>string</code> | prefix for the incoming document. |
+
+---
+
+##### `healthlakeEndpoint`<sup>Optional</sup> <a name="healthlakeEndpoint" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.healthlakeEndpoint"></a>
+
+```typescript
+public readonly healthlakeEndpoint: string;
+```
+
+- *Type:* string
+
+---
+
+##### `inputPolicyStatements`<sup>Optional</sup> <a name="inputPolicyStatements" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.inputPolicyStatements"></a>
+
+```typescript
+public readonly inputPolicyStatements: object;
+```
+
+- *Type:* object
+
+List of PolicyStatements to attach to the Lambda function for S3 GET and LIST.
+
+---
+
+##### `lambdaLogLevel`<sup>Optional</sup> <a name="lambdaLogLevel" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.lambdaLogLevel"></a>
+
+```typescript
+public readonly lambdaLogLevel: string;
+```
+
+- *Type:* string
+
+---
+
+##### `lambdaMemoryMB`<sup>Optional</sup> <a name="lambdaMemoryMB" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.lambdaMemoryMB"></a>
+
+```typescript
+public readonly lambdaMemoryMB: number;
+```
+
+- *Type:* number
+
+memory of Lambda function (may need to increase for larger documents).
+
+---
+
+##### `lambdaTimeout`<sup>Optional</sup> <a name="lambdaTimeout" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.lambdaTimeout"></a>
+
+```typescript
+public readonly lambdaTimeout: number;
+```
+
+- *Type:* number
+
+---
+
+##### `pdfMapperForFhirFunction`<sup>Optional</sup> <a name="pdfMapperForFhirFunction" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.pdfMapperForFhirFunction"></a>
+
+```typescript
+public readonly pdfMapperForFhirFunction: IFunction;
+```
+
+- *Type:* aws-cdk-lib.aws_lambda.IFunction
+
+---
+
+##### `s3InputBucket`<sup>Optional</sup> <a name="s3InputBucket" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.s3InputBucket"></a>
+
+```typescript
+public readonly s3InputBucket: string;
+```
+
+- *Type:* string
+
+---
+
+##### `s3InputPrefix`<sup>Optional</sup> <a name="s3InputPrefix" id="amazon-textract-idp-cdk-constructs.TextractPdfMapperForFhirProps.property.s3InputPrefix"></a>
+
+```typescript
+public readonly s3InputPrefix: string;
+```
+
+- *Type:* string
+
+prefix for the incoming document.
+
+Will be used to create role
+
+---
+
 ### WorkmailS3IngestionPointProps <a name="WorkmailS3IngestionPointProps" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPointProps"></a>
 
 #### Initializer <a name="Initializer" id="amazon-textract-idp-cdk-constructs.WorkmailS3IngestionPointProps.Initializer"></a>
diff --git a/lambda/pdf_mapper_for_fhir/Dockerfile b/lambda/pdf_mapper_for_fhir/Dockerfile
new file mode 100644
index 0000000..d00d9a0
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/Dockerfile
@@ -0,0 +1,10 @@
+FROM public.ecr.aws/lambda/python:3.9-x86_64
+RUN /var/lang/bin/python -m pip install --upgrade pip
+COPY app/requirements.txt ${LAMBDA_TASK_ROOT}/
+RUN python -m pip install -r ${LAMBDA_TASK_ROOT}/requirements.txt --target "${LAMBDA_TASK_ROOT}"
+
+# Copy function code
+COPY app/* ${LAMBDA_TASK_ROOT}/
+
+# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
+CMD [ "main.handler" ]
diff --git a/lambda/pdf_mapper_for_fhir/app/__init__.py b/lambda/pdf_mapper_for_fhir/app/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/lambda/pdf_mapper_for_fhir/app/entry.sh b/lambda/pdf_mapper_for_fhir/app/entry.sh
new file mode 100644
index 0000000..3f144fa
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/app/entry.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
+    exec /usr/bin/aws-lambda-rie /usr/local/bin/python -m main $1
+else
+    exec /usr/local/bin/python -m main $1
+fi
diff --git a/lambda/pdf_mapper_for_fhir/app/fhir_doc_assembler.py b/lambda/pdf_mapper_for_fhir/app/fhir_doc_assembler.py
new file mode 100644
index 0000000..9d166a9
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/app/fhir_doc_assembler.py
@@ -0,0 +1,41 @@
+import base64
+
+
+class FhirDocAssembler():
+    def __init__(self):
+        self.attachments = []
+
+    # def add_attachment(self, raw_text):
+    #     encoded_text = base64.b64encode(str.encode(raw_text)).decode('utf-8')
+    #     self.attachments.append({
+    #         'attachment': {
+    #             'data': encoded_text,
+    #             'contentType': 'text/plain'
+    #         }
+    #     })
+
+    def get_fhir_doc(self, raw_text, doc_id):
+        encoded_text = base64.b64encode(str.encode(raw_text)).decode('utf-8')
+        return {
+            'resourceType': 'DocumentReference',
+            'status': 'superseded',
+            'subject': {
+                "reference": ' '
+            },
+            'content': [
+                {
+                    'attachment': {
+                        'data': encoded_text,
+                        'contentType': 'text/plain'
+                    }
+                }
+            ],
+            "relatesTo": [
+                {
+                    "code": "appends",
+                    "target": {
+                        "reference": f"DocumentReference/{doc_id}"
+                    }
+                }
+            ],
+        }
diff --git a/lambda/pdf_mapper_for_fhir/app/main.py b/lambda/pdf_mapper_for_fhir/app/main.py
new file mode 100644
index 0000000..e4548c3
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/app/main.py
@@ -0,0 +1,47 @@
+import json
+import uuid
+import boto3
+import os
+import traceback
+import trp
+import logging
+from urllib.parse import urlparse
+from fhir_doc_assembler import FhirDocAssembler
+from send_to_healthlake import send_to_healthlake
+
+logger = logging.getLogger('SendToHealthlake')
+logger.addHandler(logging.StreamHandler())
+logger.setLevel(getattr(logging, os.getenv('LOG_LEVEL', 'INFO')))
+client =  boto3.client('s3')
+
+
+# Broken out into separate Lambda function in case there are slow-downs in textract,
+# the document is very large, or in general if the time needed for Textract exceeds
+# the 15-minute limit of Lambda.  Also, no need to leave a Lambda function running
+# while it actively polls Textract when Textract is perfectly happy notifying us on
+# SNS when it's ready for us to come back :-)
+
+def handler(event, context):
+    logger.debug(event)
+    try:
+        if event.get('textract_result'):
+            doc_id = uuid.uuid4()
+            output_json = event['textract_result']['TextractOutputJsonPath']
+            bucket = urlparse(output_json).hostname
+            object_key = urlparse(output_json).path[1:]
+            logger.debug(f'Bucket: {bucket}')
+            logger.debug(f'Key: {object_key}')
+            resp = client.get_object(Bucket=bucket, Key=object_key)
+            blocks = json.loads(resp['Body'].read())
+            document = trp.Document(blocks)
+            assembler = FhirDocAssembler()
+            logger.info(f'The document has {len(document.pages)} pages')
+            logger.info(f'Unique ID for this document is: {doc_id}')
+            for page in document.pages:
+                send_to_healthlake(assembler.get_fhir_doc(page.text, doc_id))
+                logger.debug(f"Adding attachment {page.text}")
+        else:
+            raise RuntimeError('Invalid lambda event.')
+    except Exception as e:
+        traceback.print_exc()
+        raise e
diff --git a/lambda/pdf_mapper_for_fhir/app/requirements.txt b/lambda/pdf_mapper_for_fhir/app/requirements.txt
new file mode 100644
index 0000000..9128fc3
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/app/requirements.txt
@@ -0,0 +1,2 @@
+requests
+requests_auth_aws_sigv4
diff --git a/lambda/pdf_mapper_for_fhir/app/send_to_healthlake.py b/lambda/pdf_mapper_for_fhir/app/send_to_healthlake.py
new file mode 100644
index 0000000..2b323ad
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/app/send_to_healthlake.py
@@ -0,0 +1,24 @@
+import json
+import requests
+import os
+import boto3
+import logging
+from requests_auth_aws_sigv4 import AWSSigV4
+
+logger = logging.getLogger('SendToHealthlake')
+logger.addHandler(logging.StreamHandler())
+logger.setLevel(getattr(logging, os.getenv('LOG_LEVEL', 'INFO')))
+
+
+def send_to_healthlake(fhir_doc):
+    session = boto3.session.Session()
+    auth = AWSSigV4("healthlake", session=session)
+    if DATA_STORE_ENDPOINT := os.environ.get('HEALTHLAKE_ENDPOINT'):
+        DATA_STORE_ENDPOINT += "DocumentReference"
+    else:
+        logger.error('Missing Healthlake Endpoint. Unbale to continue')
+        raise ValueError('Missing Healthlake Endpoint env.var.')
+    # Calling data store FHIR endpoint using SigV4 auth
+    logger.debug(f"Sending to HealthLake {json.dumps(fhir_doc)}")
+    resp = requests.post(DATA_STORE_ENDPOINT, json=fhir_doc, auth=auth)
+    resp.raise_for_status()
diff --git a/lambda/pdf_mapper_for_fhir/app/trp.py b/lambda/pdf_mapper_for_fhir/app/trp.py
new file mode 100644
index 0000000..ee7e8cc
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/app/trp.py
@@ -0,0 +1,700 @@
+# Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+# Permission is hereby granted, free of charge, to any person obtaining a copy of
+# this software and associated documentation files (the "Software"), to deal in
+# the Software without restriction, including without limitation the rights to
+# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+# the Software, and to permit persons to whom the Software is furnished to do so.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+class BoundingBox:
+    def __init__(self, width, height, left, top):
+        self._width = width
+        self._height = height
+        self._left = left
+        self._top = top
+
+    def __str__(self):
+        return "width: {}, height: {}, left: {}, top: {}".format(self._width, self._height, self._left, self._top)
+
+    @property
+    def width(self):
+        return self._width
+
+    @property
+    def height(self):
+        return self._height
+
+    @property
+    def left(self):
+        return self._left
+
+    @property
+    def top(self):
+        return self._top
+
+
+class Polygon:
+    def __init__(self, x, y):
+        self._x = x
+        self._y = y
+
+    def __str__(self):
+        return "x: {}, y: {}".format(self._x, self._y)
+
+    @property
+    def x(self):
+        return self._x
+
+    @property
+    def y(self):
+        return self._y
+
+
+class Geometry:
+    def __init__(self, geometry):
+        bounding_box = geometry["BoundingBox"]
+        polygon = geometry["Polygon"]
+        bb = BoundingBox(bounding_box["Width"], bounding_box["Height"], bounding_box["Left"], bounding_box["Top"])
+        pgs = []
+        for pg in polygon:
+            pgs.append(Polygon(pg["X"], pg["Y"]))
+
+        self._bounding_box = bb
+        self._polygon = pgs
+
+    def __str__(self):
+        s = "BoundingBox: {}\n".format(str(self._bounding_box))
+        return s
+
+    @property
+    def bounding_box(self):
+        return self._bounding_box
+
+    @property
+    def polygon(self):
+        return self._polygon
+
+
+class Word:
+    def __init__(self, block, block_map):
+        self._block = block
+        self._confidence = block['Confidence']
+        self._geometry = Geometry(block['Geometry'])
+        self._id = block['Id']
+        self._text = ""
+        if block['Text']:
+            self._text = block['Text']
+
+    def __str__(self):
+        return self._text
+
+    @property
+    def confidence(self):
+        return self._confidence
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def text(self):
+        return self._text
+
+    @property
+    def block(self):
+        return self._block
+
+
+class Line:
+    def __init__(self, block, block_map):
+
+        self._block = block
+        self._confidence = block['Confidence']
+        self._geometry = Geometry(block['Geometry'])
+        self._id = block['Id']
+
+        self._text = ""
+        if block['Text']:
+            self._text = block['Text']
+
+        self._words = []
+        if 'Relationships' in block and block['Relationships']:
+            for rs in block['Relationships']:
+                if rs['Type'] == 'CHILD':
+                    for cid in rs['Ids']:
+                        if cid not in block_map:
+                            continue
+                        if block_map[cid]["BlockType"] == "WORD":
+                            self._words.append(Word(block_map[cid], block_map))
+
+    def __str__(self):
+        s = "Line\n==========\n"
+        s = s + self._text + "\n"
+        s = s + "Words\n----------\n"
+        for word in self._words:
+            s = s + "[{}]".format(str(word))
+        return s
+
+    @property
+    def confidence(self):
+        return self._confidence
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def words(self):
+        return self._words
+
+    @property
+    def text(self):
+        return self._text
+
+    @property
+    def block(self):
+        return self._block
+
+
+class SelectionElement:
+    def __init__(self, block, block_map):
+        self._confidence = block['Confidence']
+        self._geometry = Geometry(block['Geometry'])
+        self._id = block['Id']
+        self._selectionStatus = block['SelectionStatus']
+
+    @property
+    def confidence(self):
+        return self._confidence
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def selection_status(self):
+        return self._selectionStatus
+
+
+class FieldKey:
+    def __init__(self, block, children, block_map):
+        self._block = block
+        self._confidence = block['Confidence']
+        self._geometry = Geometry(block['Geometry'])
+        self._id = block['Id']
+        self._text = ""
+        self._content = []
+
+        t = []
+
+        for eid in children:
+            wb = block_map[eid]
+            if wb['BlockType'] == "WORD":
+                w = Word(wb, block_map)
+                self._content.append(w)
+                t.append(w.text)
+
+        if t:
+            self._text = ' '.join(t)
+
+    def __str__(self):
+        return self._text
+
+    @property
+    def confidence(self):
+        return self._confidence
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def content(self):
+        return self._content
+
+    @property
+    def text(self):
+        return self._text
+
+    @property
+    def block(self):
+        return self._block
+
+
+class FieldValue:
+    def __init__(self, block, children, block_map):
+        self._block = block
+        self._confidence = block['Confidence']
+        self._geometry = Geometry(block['Geometry'])
+        self._id = block['Id']
+        self._text = ""
+        self._content = []
+
+        t = []
+
+        for eid in children:
+            wb = block_map[eid]
+            if wb['BlockType'] == "WORD":
+                w = Word(wb, block_map)
+                self._content.append(w)
+                t.append(w.text)
+            elif wb['BlockType'] == "SELECTION_ELEMENT":
+                se = SelectionElement(wb, block_map)
+                self._content.append(se)
+                self._text = se.selection_status
+
+        if t:
+            self._text = ' '.join(t)
+
+    def __str__(self):
+        return self._text
+
+    @property
+    def confidence(self):
+        return self._confidence
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def content(self):
+        return self._content
+
+    @property
+    def text(self):
+        return self._text
+
+    @property
+    def block(self):
+        return self._block
+
+
+class Field:
+    def __init__(self, block, block_map):
+        self._key = None
+        self._value = None
+
+        for item in block['Relationships']:
+            if item["Type"] == "CHILD":
+                self._key = FieldKey(block, item['Ids'], block_map)
+            elif item["Type"] == "VALUE":
+                for eid in item['Ids']:
+                    vkvs = block_map[eid]
+                    if 'VALUE' in vkvs['EntityTypes']:
+                        if 'Relationships' in vkvs:
+                            for v_item in vkvs['Relationships']:
+                                if v_item["Type"] == "CHILD":
+                                    self._value = FieldValue(vkvs, v_item['Ids'], block_map)
+
+    def __str__(self):
+        s = "\nField\n==========\n"
+        k = ""
+        v = ""
+        if self._key:
+            k = str(self._key)
+        if self._value:
+            v = str(self._value)
+        s = s + "Key: {}\nValue: {}".format(k, v)
+        return s
+
+    @property
+    def key(self):
+        return self._key
+
+    @property
+    def value(self):
+        return self._value
+
+
+class Form:
+    def __init__(self):
+        self._fields = []
+        self._fields_map = {}
+
+    def add_field(self, field):
+        self._fields.append(field)
+        self._fields_map[field.key.text] = field
+
+    def __str__(self):
+        s = ""
+        for field in self._fields:
+            s = s + str(field) + "\n"
+        return s
+
+    @property
+    def fields(self):
+        return self._fields
+
+    def get_field_by_key(self, key):
+        field = None
+        if key in self._fields_map:
+            field = self._fields_map[key]
+        return field
+
+    def search_fields_by_key(self, key):
+        search_key = key.lower()
+        results = []
+        for field in self._fields:
+            if field.key and search_key in field.key.text.lower():
+                results.append(field)
+        return results
+
+
+class Cell:
+
+    def __init__(self, block, block_map):
+        self._block = block
+        self._confidence = block['Confidence']
+        self._rowIndex = block['RowIndex']
+        self._columnIndex = block['ColumnIndex']
+        self._rowSpan = block['RowSpan']
+        self._columnSpan = block['ColumnSpan']
+        self._geometry = Geometry(block['Geometry'])
+        self._id = block['Id']
+        self._content = []
+        self._text = ""
+        if 'Relationships' in block and block['Relationships']:
+            for rs in block['Relationships']:
+                if rs['Type'] == 'CHILD':
+                    for cid in rs['Ids']:
+                        block_type = block_map[cid]["BlockType"]
+                        if block_type == "WORD":
+                            w = Word(block_map[cid], block_map)
+                            self._content.append(w)
+                            self._text = self._text + w.text + ' '
+                        elif block_type == "SELECTION_ELEMENT":
+                            se = SelectionElement(block_map[cid], block_map)
+                            self._content.append(se)
+                            self._text = self._text + se.selection_status + ', '
+
+    def __str__(self):
+        return self._text
+
+    @property
+    def confidence(self):
+        return self._confidence
+
+    @property
+    def row_index(self):
+        return self._rowIndex
+
+    @property
+    def column_index(self):
+        return self._columnIndex
+
+    @property
+    def row_span(self):
+        return self._rowSpan
+
+    @property
+    def column_span(self):
+        return self._columnSpan
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def content(self):
+        return self._content
+
+    @property
+    def text(self):
+        return self._text
+
+    @property
+    def block(self):
+        return self._block
+
+
+class Row:
+    def __init__(self):
+        self._cells = []
+
+    def __str__(self):
+        s = ""
+        for cell in self._cells:
+            s = s + "[{}]".format(str(cell))
+        return s
+
+    @property
+    def cells(self):
+        return self._cells
+
+
+class Table:
+
+    def __init__(self, block, block_map):
+
+        self._block = block
+
+        self._confidence = block['Confidence']
+        self._geometry = Geometry(block['Geometry'])
+
+        self._id = block['Id']
+        self._rows = []
+
+        ri = 1
+        row = Row()
+        if 'Relationships' in block and block['Relationships']:
+            for rs in block['Relationships']:
+                if rs['Type'] == 'CHILD':
+                    for cid in rs['Ids']:
+                        cell = Cell(block_map[cid], block_map)
+                        if cell.row_index > ri:
+                            self._rows.append(row)
+                            row = Row()
+                            ri = cell.row_index
+                        row.cells.append(cell)
+                    if row and row.cells:
+                        self._rows.append(row)
+
+    def __str__(self):
+        s = "Table\n==========\n"
+        for row in self._rows:
+            s = s + "Row\n==========\n"
+            s = s + str(row) + "\n"
+        return s
+
+    @property
+    def confidence(self):
+        return self._confidence
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def rows(self):
+        return self._rows
+
+    @property
+    def block(self):
+        return self._block
+
+
+class Page:
+
+    def __init__(self, blocks, block_map):
+        self._blocks = blocks
+        self._text = ""
+        self._lines = []
+        self._form = Form()
+        self._tables = []
+        self._selection_element = []
+        self._content = []
+        self._orientation = True
+
+        self._parse(block_map)
+
+    def __str__(self):
+        s = "Page\n==========\n"
+        for item in self._content:
+            s = s + str(item) + "\n"
+        return s
+
+    def _parse(self, block_map):
+        for item in self._blocks:
+            if item["BlockType"] == "PAGE":
+                self._geometry = Geometry(item['Geometry'])
+                self._id = item['Id']
+                self._orientation = item['Orientation']
+            elif item["BlockType"] == "LINE":
+                line_item = Line(item, block_map)
+                self._lines.append(line_item)
+                self._content.append(line_item)
+                self._text = self._text + line_item.text + '\n'
+            elif item["BlockType"] == "TABLE":
+                table_item = Table(item, block_map)
+                self._tables.append(table_item)
+                self._content.append(table_item)
+            elif item["BlockType"] == "SELECTION_ELEMENT":
+                selection_item = SelectionElement(item, block_map)
+                self._selection_element.append(selection_item)
+                self._content.append(selection_item)
+            elif item["BlockType"] == "KEY_VALUE_SET":
+                if 'KEY' in item['EntityTypes']:
+                    f = Field(item, block_map)
+                    if f.key:
+                        self._form.add_field(f)
+                        self._content.append(f)
+                    else:
+                        print("WARNING: Detected K/V where key does not have content. Excluding key from output.")
+                        print(f)
+                        print(item)
+
+    def get_lines_in_reading_order(self):
+        columns = []
+        lines = []
+        for item in self._lines:
+            column_found = False
+            for index, column in enumerate(columns):
+                bbox_left = item.geometry.bounding_box.left
+                bbox_right = item.geometry.bounding_box.left + item.geometry.bounding_box.width
+                bbox_centre = item.geometry.bounding_box.left + item.geometry.bounding_box.width / 2
+                column_centre = column['left'] + column['right'] / 2
+                if column['left'] < bbox_centre < column['right'] or bbox_left < column_centre < bbox_right:
+                    # Bbox appears inside the column
+                    lines.append([index, item])
+                    column_found = True
+                    break
+            if not column_found:
+                columns.append({'left': item.geometry.bounding_box.left,
+                                'right': item.geometry.bounding_box.left + item.geometry.bounding_box.width})
+                lines.append([len(columns) - 1, item])
+
+        lines.sort(key=lambda x: x[0])
+        return lines
+
+    def get_text_in_reading_order(self):
+        lines = self.get_lines_in_reading_order()
+        text = ""
+        for line in lines:
+            text = text + line[1] + '\n'
+        return text
+
+    @property
+    def blocks(self):
+        return self._blocks
+
+    @property
+    def text(self):
+        return self._text
+
+    @property
+    def lines(self):
+        return self._lines
+
+    @property
+    def form(self):
+        return self._form
+
+    @property
+    def tables(self):
+        return self._tables
+
+    @property
+    def selections(self):
+        return self._selection_element
+
+    @property
+    def content(self):
+        return self._content
+
+    @property
+    def geometry(self):
+        return self._geometry
+
+    @property
+    def id(self):
+        return self._id
+
+    @property
+    def orientation(self):
+        return self._orientation
+
+
+class Document:
+
+    def __init__(self, response_pages):
+
+        if not isinstance(response_pages, list):
+            rps = [response_pages]
+            response_pages = rps
+
+        self._responsePages = response_pages
+        self._pages = []
+
+        self._parse()
+
+    def __str__(self):
+        s = "\nDocument\n==========\n"
+        for p in self._pages:
+            s = s + str(p) + "\n\n"
+        return s
+
+    def _parse_document_pages_and_block_map(self):
+
+        block_map = {}
+
+        document_pages = []
+        document_page = None
+        for page in self._responsePages:
+            for block in page['Blocks']:
+                if 'BlockType' in block and 'Id' in block:
+                    block_map[block['Id']] = block
+
+                if block['BlockType'] == 'PAGE':
+                    if block['Geometry']['Polygon'][0]['X'] > block['Geometry']['Polygon'][1]['X']:
+                        block['Orientation'] = False
+                    else:
+                        block['Orientation'] = True
+                    if document_page:
+                        document_pages.append({"Blocks": document_page})
+                    document_page = [block]
+                else:
+                    if document_page:
+                        document_page.append(block)
+        if document_page:
+            document_pages.append({"Blocks": document_page})
+        return document_pages, block_map
+
+    def _parse(self):
+
+        self._response_document_pages, self._block_map = self._parse_document_pages_and_block_map()
+        for documentPage in self._response_document_pages:
+            page = Page(documentPage["Blocks"], self._block_map)
+            self._pages.append(page)
+
+    @property
+    def blocks(self):
+        return self._responsePages
+
+    @property
+    def page_blocks(self):
+        return self._response_document_pages
+
+    @property
+    def pages(self):
+        return self._pages
+
+    def get_block_by_id(self, block_id):
+        block = None
+        if self._block_map and block_id in self._block_map:
+            block = self._block_map[block_id]
+        return block
diff --git a/lambda/pdf_mapper_for_fhir/env.json b/lambda/pdf_mapper_for_fhir/env.json
new file mode 100644
index 0000000..ccc709f
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/env.json
@@ -0,0 +1,8 @@
+{
+    "Parameters": {
+        "HEALTHLAKE_ENDPOINT": "https://healthlake.us-east-2.amazonaws.com/datastore/83c10afe8566667ac2489c8d989b2c14/r4/",
+        "SNS_ARN": "arn:aws:sns:us-east-2:109881088269:Textract",
+        "ROLE_ARN": "arn:aws:iam::109881088269:role/Role_Textract",
+        "LOG_LEVEL": "DEBUG"
+    }
+}
diff --git a/lambda/pdf_mapper_for_fhir/events/event.json b/lambda/pdf_mapper_for_fhir/events/event.json
new file mode 100644
index 0000000..c86f84b
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/events/event.json
@@ -0,0 +1,14 @@
+{
+  "manifest":
+  {
+    "s3Path": "s3://pdfmappertofhirworkflow-textractsimplesyncworkflo-13ne9s3betcpj/uploads/fax-190517121115-6784593217-11_Redacted.pdf"
+  },
+  "mime": "application/pdf",
+  "classification": null,
+  "numberOfPages": 2,
+  "textract_result":
+  {
+    "TextractTempOutputJsonPath": "s3://pdfmappertofhirworkflow-textractsimplesyncworkflo-13ne9s3betcpj/temp/a8cdb100b8414882978cef68cf49c7ed1e47a68680ffa9fd442a69ae8c05bf4c",
+    "TextractOutputJsonPath": "s3://pdfmappertofhirworkflow-textractsimplesyncworkflo-13ne9s3betcpj/textract-output/fax-190517121115-6784593217-11_Redacted2023-04-19T18:49:29.225383/fax-190517121115-6784593217-11_Redacted.json"
+  }
+}
\ No newline at end of file
diff --git a/lambda/pdf_mapper_for_fhir/template.yaml b/lambda/pdf_mapper_for_fhir/template.yaml
new file mode 100644
index 0000000..496fd45
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/template.yaml
@@ -0,0 +1,27 @@
+AWSTemplateFormatVersion: '2010-09-09'
+Transform: AWS::Serverless-2016-10-31
+Description: >
+  python3.9
+
+  Lambda function for PDF Mapper for FHIR
+
+Globals:
+  Function:
+    Timeout: 900
+
+Resources:
+  PdfMapperForFhirFunction:
+    Type: AWS::Serverless::Function
+    Properties:
+      PackageType: Image
+      Architectures:
+        - x86_64
+      Environment:
+        Variables:
+          HEALTHLAKE_ENDPOINT: https://healthlake.us-east-2.amazonaws.com/datastore/83c10afe8566667ac2489c8d989b2c14/r4/
+          LOG_LEVEL: INFO
+    Metadata:
+      Dockerfile: Dockerfile
+      DockerContext: .
+      DockerTag: python3.9-v1
+
diff --git a/package.json b/package.json
index 302065f..1e5526d 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
     "@types/node": "^14",
     "@typescript-eslint/eslint-plugin": "^5",
     "@typescript-eslint/parser": "^5",
-    "aws-cdk-lib": "2.74.0",
+    "aws-cdk-lib": "2.1.0",
     "constructs": "10.0.5",
     "eslint": "^8",
     "eslint-import-resolver-node": "^0.3.7",
diff --git a/src/index.ts b/src/index.ts
index f3db8bf..3ae8343 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -23,7 +23,7 @@ export { SpacySfnTask, SpacySfnTaskProps } from './spacyClassification';
 export { DocumentSplitter, DocumentSplitterProps } from './documentSplitter';
 export { RDSAuroraServerless, RDSAuroraServerlessProps } from './rdsAuroraServerless';
 export { WorkmailS3IngestionPoint, WorkmailS3IngestionPointProps } from './workmailS3IngestionPoint';
-export { SearchablePDF, SearchablePDFProps } from './searchablePDF';
+export { TextractPdfMapperForFhir, TextractPdfMapperForFhirProps } from './textractPdfMapperForFhir';
 
 export function validatePatternSupported(integrationPattern: sfn.IntegrationPattern, supportedPatterns: sfn.IntegrationPattern[]) {
   if (! supportedPatterns.includes(integrationPattern)) {
diff --git a/src/textractPdfMapperForFhir.ts b/src/textractPdfMapperForFhir.ts
new file mode 100644
index 0000000..087f3b2
--- /dev/null
+++ b/src/textractPdfMapperForFhir.ts
@@ -0,0 +1,112 @@
+import * as path from 'path';
+import { Duration } from 'aws-cdk-lib';
+import * as iam from 'aws-cdk-lib/aws-iam';
+import * as lambda from 'aws-cdk-lib/aws-lambda';
+import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
+import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
+import { Construct } from 'constructs';
+
+export interface TextractPdfMapperForFhirProps {
+  /** memory of Lambda function (may need to increase for larger documents) */
+  readonly lambdaMemoryMB?: number;
+  readonly lambdaTimeout?: number;
+  readonly pdfMapperForFhirFunction?: lambda.IFunction;
+  readonly lambdaLogLevel?: string;
+  readonly healthlakeEndpoint?: string;
+  readonly s3InputBucket?: string;
+  /** prefix for the incoming document. Will be used to create role */
+  readonly s3InputPrefix?: string;
+  /** List of PolicyStatements to attach to the Lambda function for S3 GET and LIST. */
+  readonly inputPolicyStatements?: [iam.PolicyStatement];
+}
+
+/**
+ * This construct takes in a manifest definition or a plain JSON with a s3Path:
+ *
+ * example s3Path:
+ * {"s3Path": "s3://bucketname/prefix/image.png"}
+ *
+ *
+ * Then it generated the numberOfPages attribute and the mime on the context.
+ * The mime types checked against the supported mime types for Textract and if fails, will raise an Exception failing the workflow.
+ *
+ * Example (Python)
+ * ```python
+ decider_task_id = tcdk.TextractPOCDecider(
+ self,
+ f"InsuranceDecider",
+ )
+ ```
+
+ *
+ */
+export class TextractPdfMapperForFhir extends sfn.StateMachineFragment {
+  public readonly startState: sfn.State;
+  public readonly endStates: sfn.INextable[];
+  public readonly pdfMapperForFhirFunction: lambda.IFunction;
+
+  constructor(parent: Construct, id: string, props: TextractPdfMapperForFhirProps) {
+    super(parent, id);
+
+    var lambdaMemoryMB = props.lambdaMemoryMB === undefined ? 1024 : props.lambdaMemoryMB;
+    var lambdaTimeout = props.lambdaTimeout === undefined ? 900 : props.lambdaTimeout;
+    var lambdaLogLevel = props.lambdaLogLevel === undefined ? 'INFO' : props.lambdaLogLevel;
+    var healthlakeEndpoint = props.healthlakeEndpoint === undefined ? '' : props.healthlakeEndpoint;
+    var s3InputPrefix = props.s3InputPrefix === undefined ? 'uploads' : props.s3InputPrefix;
+
+    this.pdfMapperForFhirFunction = new lambda.DockerImageFunction(
+      this,
+      'TextractPdfMapperForFhir',
+      {
+        code: lambda.DockerImageCode.fromImageAsset(
+          path.join(__dirname, '../lambda/pdf_mapper_for_fhir/'),
+        ),
+        architecture: lambda.Architecture.X86_64,
+        memorySize: lambdaMemoryMB,
+        timeout: Duration.seconds(lambdaTimeout),
+        environment: {
+          HEALTHLAKE_ENDPOINT: healthlakeEndpoint,
+          LOG_LEVEL: lambdaLogLevel,
+        },
+      },
+    );
+
+    if (props.inputPolicyStatements === undefined) {
+      if (props.s3InputBucket === undefined) {
+        this.pdfMapperForFhirFunction.addToRolePolicy(
+          new iam.PolicyStatement({
+            actions: ['s3:GetObject', 's3:ListBucket'],
+            resources: ['*'],
+          }),
+        );
+      } else {
+        this.pdfMapperForFhirFunction.addToRolePolicy(
+          new iam.PolicyStatement({
+            actions: ['s3:GetObject', 's3:ListBucket'],
+            resources: [
+              path.join(`arn:aws:s3:::${props.s3InputBucket}`, s3InputPrefix, '/'),
+              path.join(`arn:aws:s3:::${props.s3InputBucket}`, s3InputPrefix, '/*'),
+            ],
+          }),
+        );
+      }
+      this.pdfMapperForFhirFunction.addToRolePolicy(
+        new iam.PolicyStatement({
+          actions: ['healthlake:CreateResource'],
+          resources: ['*'],
+        }),
+      );
+    } else {
+      for (var policyStatement of props.inputPolicyStatements) {
+        this.pdfMapperForFhirFunction.addToRolePolicy(policyStatement);
+      }
+    }
+    const pdfMapperForFhirLambdaInvoke = new tasks.LambdaInvoke(this, id, {
+      lambdaFunction: this.pdfMapperForFhirFunction,
+      timeout: Duration.seconds(600),
+      outputPath: '$.Payload',
+    });
+    this.startState = pdfMapperForFhirLambdaInvoke;
+    this.endStates = [pdfMapperForFhirLambdaInvoke];
+  }
+}
diff --git a/yarn.lock b/yarn.lock
index 5dd39d4..4ffd422 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10,21 +10,6 @@
     "@jridgewell/gen-mapping" "^0.1.0"
     "@jridgewell/trace-mapping" "^0.3.9"
 
-"@aws-cdk/asset-awscli-v1@^2.2.97":
-  version "2.2.143"
-  resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.143.tgz#d43a6bcd63a8545c46e7ca7ee0c3a27e98530cdc"
-  integrity sha512-KQ6JLYBwBVa/MUggGk1QHPvmzasPkO1xJ4PPNgrIhr9hey1mF3wpx6Jt5La/0r9YufNJlQCgFbxAr4HzaMAjPg==
-
-"@aws-cdk/asset-kubectl-v20@^2.1.1":
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.1.tgz#d01c1efb867fb7f2cfd8c8b230b8eae16447e156"
-  integrity sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw==
-
-"@aws-cdk/asset-node-proxy-agent-v5@^2.0.77":
-  version "2.0.118"
-  resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.118.tgz#9cd7cf7bbd4f28ba073e2dbb6c24600468dc2b3b"
-  integrity sha512-BvLXKsAykxnmW7A+pXdND0lsJCJDK52JXVD+BfO8XAsWV5nSO3MAooxgbWCT8vyTXU8G2Zm+H6F5fikQhi3T9Q==
-
 "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6":
   version "7.18.6"
   resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz"
@@ -1116,7 +1101,7 @@ ajv@^6.10.0, ajv@^6.12.4:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
-ajv@^8.0.1, ajv@^8.11.2:
+ajv@^8.11.2:
   version "8.12.0"
   resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz"
   integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
@@ -1258,11 +1243,6 @@ arrify@^1.0.1:
   resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
   integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
 
-astral-regex@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
-  integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
@@ -1278,23 +1258,19 @@ available-typed-arrays@^1.0.5:
   resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz"
   integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
 
-aws-cdk-lib@2.74.0:
-  version "2.74.0"
-  resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.74.0.tgz#dce596bb3c54d8895e7870032ac00b82c1db2259"
-  integrity sha512-cPoYEVmJ06pi57q4uW2v/dwXvkr9JHDeSd4+ylBALccbYiRPlZw0OiNH+F2B+hrDVAiaYZWV3HE8hVDDON4+ZA==
+aws-cdk-lib@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.1.0.tgz#2497484cfd4e2eeaba99b070bbfa54486d52ae34"
+  integrity sha512-W607G3aSrWpawpcqzIuUYKlU+grfvkbszyqikyVYqJgMHFCCQXq0S1ynPMzfQ49CwjlwZsu4LIsPM+dNR+Yj6g==
   dependencies:
-    "@aws-cdk/asset-awscli-v1" "^2.2.97"
-    "@aws-cdk/asset-kubectl-v20" "^2.1.1"
-    "@aws-cdk/asset-node-proxy-agent-v5" "^2.0.77"
     "@balena/dockerignore" "^1.0.2"
     case "1.6.3"
     fs-extra "^9.1.0"
-    ignore "^5.2.4"
-    jsonschema "^1.4.1"
-    minimatch "^3.1.2"
-    punycode "^2.3.0"
-    semver "^7.3.8"
-    table "^6.8.1"
+    ignore "^5.1.9"
+    jsonschema "^1.4.0"
+    minimatch "^3.0.4"
+    punycode "^2.1.1"
+    semver "^7.3.5"
     yaml "1.10.2"
 
 babel-jest@^27.5.1:
@@ -3190,7 +3166,7 @@ ignore-walk@^6.0.0:
   dependencies:
     minimatch "^5.0.1"
 
-ignore@^5.2.0, ignore@^5.2.4:
+ignore@^5.1.9, ignore@^5.2.0:
   version "5.2.4"
   resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz"
   integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
@@ -4218,7 +4194,7 @@ jsonparse@^1.2.0, jsonparse@^1.3.1:
   resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz"
   integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==
 
-jsonschema@^1.4.1:
+jsonschema@^1.4.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab"
   integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==
@@ -4333,11 +4309,6 @@ lodash.merge@^4.6.2:
   resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
   integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
-lodash.truncate@^4.4.2:
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
-  integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
-
 lodash@^4.17.15, lodash@^4.17.21, lodash@^4.7.0:
   version "4.17.21"
   resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
@@ -5251,7 +5222,7 @@ pump@^3.0.0:
     end-of-stream "^1.1.0"
     once "^1.3.1"
 
-punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0:
+punycode@^2.1.0, punycode@^2.1.1:
   version "2.3.0"
   resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz"
   integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
@@ -5659,15 +5630,6 @@ slash@^4.0.0:
   resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz"
   integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
 
-slice-ansi@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
-  integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
-  dependencies:
-    ansi-styles "^4.0.0"
-    astral-regex "^2.0.0"
-    is-fullwidth-code-point "^3.0.0"
-
 smart-buffer@^4.2.0:
   version "4.2.0"
   resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz"
@@ -5985,17 +5947,6 @@ synckit@^0.8.4:
     "@pkgr/utils" "^2.3.1"
     tslib "^2.4.0"
 
-table@^6.8.1:
-  version "6.8.1"
-  resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf"
-  integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==
-  dependencies:
-    ajv "^8.0.1"
-    lodash.truncate "^4.4.2"
-    slice-ansi "^4.0.0"
-    string-width "^4.2.3"
-    strip-ansi "^6.0.1"
-
 tapable@^2.2.0:
   version "2.2.1"
   resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz"


Test patch:
diff --git a/lambda/pdf_mapper_for_fhir/test_sam_local.sh b/lambda/pdf_mapper_for_fhir/test_sam_local.sh
new file mode 100755
index 0000000..4c4e983
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/test_sam_local.sh
@@ -0,0 +1,2 @@
+sam build
+sam local invoke -n env.json -e events/event.json
diff --git a/lambda/pdf_mapper_for_fhir/tests/data/sample_manifest.json b/lambda/pdf_mapper_for_fhir/tests/data/sample_manifest.json
new file mode 100644
index 0000000..7dc98a5
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/tests/data/sample_manifest.json
@@ -0,0 +1,14 @@
+{
+    "s3Path": "s3://amazon-textract-public-content/blogs/employeeapp20210510.png",
+    "textractFeatures": [
+        "FORMS",
+        "TABLES",
+        "QUERIES"
+    ],
+    "queriesConfig": [{
+        "text": "What is the applicant full name?",
+        "alias": "FULL_NAME",
+        "pages": "[*]"
+    }],
+    "classification": "APPLICATION",
+}
diff --git a/lambda/pdf_mapper_for_fhir/tests/data/simple_feature_manifest.json b/lambda/pdf_mapper_for_fhir/tests/data/simple_feature_manifest.json
new file mode 100644
index 0000000..61b5e4c
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/tests/data/simple_feature_manifest.json
@@ -0,0 +1,13 @@
+{
+    "s3Path": "s3://amazon-textract-public-content/blogs/employeeapp20210510.png",
+    "textractFeatures": [
+        "FORMS",
+        "TABLES",
+        "QUERIES"
+    ],
+    "queries_config": [{
+        "text": "What is the applicant full name?",
+        "alias": "FULL_NAME",
+        "pages": "[*]"
+    }]
+}
diff --git a/lambda/pdf_mapper_for_fhir/tests/test_pdf_mapper_for_fhir.py b/lambda/pdf_mapper_for_fhir/tests/test_pdf_mapper_for_fhir.py
new file mode 100644
index 0000000..1977b4f
--- /dev/null
+++ b/lambda/pdf_mapper_for_fhir/tests/test_pdf_mapper_for_fhir.py
@@ -0,0 +1,19 @@
+import json
+import io
+import os
+import boto3
+
+current_folder = os.path.dirname(os.path.realpath(__file__))
+
+
+def test_serializer_manifest(caplog):
+    s3_bucket = 'sdx-textract-us-east-1'
+    s3_key = 'sample_manifest.json'
+    s3_client = boto3.client('s3')
+    o = s3_client.get_object(Bucket=s3_bucket, Key=s3_key)
+    file_content = o.get('Body').read().decode('utf-8')
+    json_content = json.loads(file_content)
+    assert json_content
+    assert json_content['s3Path']
+    assert json_content['textractFeatures']
+    assert len(json_content['textractFeatures']) == 3
diff --git a/test/textractPdfMapperForFhir.test.ts b/test/textractPdfMapperForFhir.test.ts
new file mode 100644
index 0000000..e5e993d
--- /dev/null
+++ b/test/textractPdfMapperForFhir.test.ts
@@ -0,0 +1,18 @@
+import { Stack } from 'aws-cdk-lib';
+import { Template } from 'aws-cdk-lib/assertions';
+import { TextractPdfMapperForFhir } from '../src';
+
+let stack: Stack;
+beforeEach(() => {
+  stack = new Stack();
+});
+
+describe('ClassificationTest', () => {
+  test('ClassificationTest', () => {
+    new TextractPdfMapperForFhir(stack, 'idp-decider', {
+    });
+    expect(Template.fromStack(stack).toJSON()).toMatchSnapshot();
+    const template = Template.fromStack(stack);
+    template.resourceCountIs('AWS::Lambda::Function', 1);
+  });
+});