diff --git a/README.md b/README.md
index 82f38933..dee50a29 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,8 @@
 [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/naptha/tesseract.js/graphs/commit-activity)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 [![Code Style](https://badgen.net/badge/code%20style/airbnb/ff5a5f?icon=airbnb)](https://github.com/airbnb/javascript)
-[![Downloads Month](https://img.shields.io/npm/dm/tesseract.js.svg)](https://www.npmjs.com/package/tesseract.js)
+![npm](https://img.shields.io/npm/dm/tesseract.js?label=npm%20downloads)
+![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hm/tesseract.js?label=jsdelivr%20hits)
 
 Tesseract.js is a javascript library that gets words in [almost any language](./docs/tesseract_lang_list.md) out of images. ([Demo](http://tesseract.projectnaptha.com/))
 
@@ -133,11 +134,13 @@ yarn add tesseract.js@3.0.3
 
 ## Use tesseract.js the way you like!
 
-- Offline Version: https://github.com/jeromewu/tesseract.js-offline
 - Electron Version: https://github.com/Balearica/tesseract.js-electron
+- Chrome Extension (with Manifest V3): https://github.com/Tshetrim/Image-To-Text-OCR-extension-for-ChatGPT
+- Converting PDF to text: https://github.com/racosa/pdf2text-ocr
+
+The following are old examples that use depreciated versions of Tesseract.js.  Updating to Tesseract.js v4 is highly recommended.  Users are encouraged to create updated examples (or make entirely new ones) and submit them as pull requests. 
+- Offline Version: https://github.com/jeromewu/tesseract.js-offline
 - Custom Traineddata: https://github.com/jeromewu/tesseract.js-custom-traineddata
-- Chrome Extension #1: https://github.com/jeromewu/tesseract.js-chrome-extension
-- Chrome Extension #2: https://github.com/fxnoob/image-to-text
 - Firefox Extension: https://github.com/gnonio/korporize
 - With Vue: https://github.com/jeromewu/tesseract.js-vue-app
 - With Angular: https://github.com/jeromewu/tesseract.js-angular-app
@@ -145,9 +148,7 @@ yarn add tesseract.js@3.0.3
 - Typescript: https://github.com/jeromewu/tesseract.js-typescript
 - Video Real-time Recognition: https://github.com/jeromewu/tesseract.js-video
 
-React Native is **not** supported as it does not support Webassembly. 
-
-Disclaimer: These examples are now several years old and use old versions of both Tesseract.js and the relevant frameworks.  Users are encouraged to use the latest version of Tesseract.js rather than the versions used in these examples.  For users that update these examples (or make new ones), please consider contributing through a PR.   
+React Native is **not** supported as it does not support Webassembly.
 
 ## Contributing
 
diff --git a/package-lock.json b/package-lock.json
index 2a721cff..a29adcfa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "tesseract.js",
-  "version": "4.1.0",
+  "version": "4.1.1",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "tesseract.js",
-      "version": "4.1.0",
+      "version": "4.1.1",
       "hasInstallScript": true,
       "license": "Apache-2.0",
       "dependencies": {
diff --git a/package.json b/package.json
index d24ec80c..f15fb84f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "tesseract.js",
-  "version": "4.1.0",
+  "version": "4.1.1",
   "description": "Pure Javascript Multilingual OCR",
   "main": "src/index.js",
   "types": "src/index.d.ts",
diff --git a/src/index.d.ts b/src/index.d.ts
index d4404b32..43025f29 100644
--- a/src/index.d.ts
+++ b/src/index.d.ts
@@ -43,6 +43,15 @@ declare namespace Tesseract {
     load_number_dawg: string
     load_bigram_dawg: string
   }
+  
+  type LoggerMessage = {
+    jobId: string
+    progress: number
+    status: string
+    userJobId: string
+    workerId: string
+  }
+  
   interface WorkerOptions {
     corePath: string
     langPath: string
@@ -52,7 +61,7 @@ declare namespace Tesseract {
     cacheMethod: string
     workerBlobURL: boolean
     gzip: boolean
-    logger: (arg: any) => void,
+    logger: (arg: LoggerMessage) => void,
     errorHandler: (arg: any) => void
   }
   interface WorkerParams {
diff --git a/src/worker-script/utils/setImage.js b/src/worker-script/utils/setImage.js
index 354521f1..f60d4c3b 100644
--- a/src/worker-script/utils/setImage.js
+++ b/src/worker-script/utils/setImage.js
@@ -11,7 +11,7 @@ module.exports = (TessModule, api, image, angle = 0) => {
   // Check for bmp magic numbers (42 and 4D in hex)
   const isBmp = (image[0] === 66 && image[1] === 77) || (image[1] === 66 && image[0] === 77);
 
-  const exif = image.slice(0, 500).toString().match(/\x01\x12\x00\x03\x00\x00\x00\x01\x00(.)/)?.[1]?.charCodeAt(0) || 1;
+  const exif = parseInt(image.slice(0, 500).join(' ').match(/1 18 0 3 0 0 0 1 0 (\d)/)?.[1], 10) || 1;
 
   // /*
   //  * Leptonica supports some but not all bmp files
diff --git a/tests/assets/images/simple-180.jpg b/tests/assets/images/simple-180.jpg
new file mode 100644
index 00000000..344fcf29
Binary files /dev/null and b/tests/assets/images/simple-180.jpg differ
diff --git a/tests/assets/images/simple-270.jpg b/tests/assets/images/simple-270.jpg
new file mode 100644
index 00000000..e89c9c1b
Binary files /dev/null and b/tests/assets/images/simple-270.jpg differ
diff --git a/tests/assets/images/simple-90.jpg b/tests/assets/images/simple-90.jpg
new file mode 100644
index 00000000..d8863dbc
Binary files /dev/null and b/tests/assets/images/simple-90.jpg differ
diff --git a/tests/recognize.test.js b/tests/recognize.test.js
index ca7ece4e..41a6f23b 100644
--- a/tests/recognize.test.js
+++ b/tests/recognize.test.js
@@ -30,6 +30,20 @@ describe('recognize()', () => {
     ));
   });
 
+  describe('should support orientation metadata', () => {
+    [
+      { name: 'simple-90.jpg', desc: 'simple', ans: SIMPLE_TEXT },
+      { name: 'simple-180.jpg', desc: 'simple', ans: SIMPLE_TEXT },
+      { name: 'simple-270.jpg', desc: 'simple', ans: SIMPLE_TEXT },
+    ].forEach(({ name, desc, ans }) => (
+      it(`recongize ${desc} image`, async () => {
+        await worker.initialize('eng');
+        const { data: { text } } = await worker.recognize(`${IMAGE_PATH}/${name}`);
+        expect(text).to.be(ans);
+      }).timeout(TIMEOUT)
+    ));
+  });
+
   describe('should recognize base64 image (simplified interface)', () => {
     [
       { format: 'png', image: SIMPLE_PNG_BASE64, ans: SIMPLE_TEXT },
