From 42f8e6b7f2ac0a1ebe08340f32b578d0c6c84a8b Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Mon, 23 Jan 2023 11:57:37 -0500 Subject: [PATCH 1/4] Implement OCR --- .vscode/extensions.json | 7 ++ .vscode/settings.json | 13 +++ README.md | 4 +- lib/pdfservices.rb | 6 + lib/pdfservices/ocr/operation.rb | 104 ++++++++++++++++++ lib/pdfservices/ocr/result.rb | 24 ++++ lib/pdfservices/version.rb | 2 +- test/fixtures/files/fake_ocr_done.pdf | Bin 0 -> 23 bytes test/fixtures/files/not_yet_ocr.pdf | Bin 0 -> 21530 bytes test/fixtures/ocr_done.json | 3 + test/fixtures/ocr_in_progress.json | 7 ++ .../presigned_upload_url_response.json | 4 + test/integration_spikes/ocr.rb | 19 ++++ ..._integration.rb => test_document_merge.rb} | 2 +- test/pdf_services_sdk/test_ocr.rb | 88 +++++++++++++++ 15 files changed, 280 insertions(+), 3 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 lib/pdfservices/ocr/operation.rb create mode 100644 lib/pdfservices/ocr/result.rb create mode 100644 test/fixtures/files/fake_ocr_done.pdf create mode 100644 test/fixtures/files/not_yet_ocr.pdf create mode 100644 test/fixtures/ocr_done.json create mode 100644 test/fixtures/ocr_in_progress.json create mode 100644 test/fixtures/presigned_upload_url_response.json create mode 100644 test/integration_spikes/ocr.rb rename test/pdf_services_sdk/{test_integration.rb => test_document_merge.rb} (97%) create mode 100644 test/pdf_services_sdk/test_ocr.rb diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..6b0e261 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "rebornix.ruby", + "oderwat.indent-rainbow", + "ms-vsliveshare.vsliveshare" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e1a29cc --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "editor.rulers": [ + 100, + 120 + ], + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/.DS_Store": true, + "**/tmp": true + } +} diff --git a/README.md b/README.md index 734030e..7204c3b 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,10 @@ Then you need to create a json file with your credentials: } ``` +### Supported API calls: -Right now the only supported API is document merge. See `test/pdf_services_sdk/test_integration.rb` for an example usage. +- Document merge. See `test/pdf_services_sdk/test_integration.rb` for an example usage. +- OCR. See `test/pdf_services_sdk/test_ocr.rb` for an example usage. ## Development diff --git a/lib/pdfservices.rb b/lib/pdfservices.rb index b27e867..c162abe 100644 --- a/lib/pdfservices.rb +++ b/lib/pdfservices.rb @@ -5,6 +5,7 @@ require "jwt" require "multipart_parser/reader" require "yaml" +require "pdfservices/version" module PdfServices autoload :CredentialsBuilder, "pdfservices/credentials_builder" @@ -15,4 +16,9 @@ module DocumentMerge autoload :Operation, "pdfservices/document_merge/operation" autoload :Result, "pdfservices/document_merge/result" end + + module Ocr + autoload :Operation, "pdfservices/ocr/operation" + autoload :Result, "pdfservices/ocr/result" + end end diff --git a/lib/pdfservices/ocr/operation.rb b/lib/pdfservices/ocr/operation.rb new file mode 100644 index 0000000..c1561f1 --- /dev/null +++ b/lib/pdfservices/ocr/operation.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +require "http" +require "pdfservices/jwt_provider" +require "pdfservices/ocr/result" +require "yaml" + +module PdfServices + module Ocr + class Operation + PRESIGNED_URL_ENDPOINT = "https://pdf-services.adobe.io/assets" + OCR_ENDPOINT = "https://pdf-services.adobe.io/operation/ocr" + ASSETS_ENDPOINT = "https://pdf-services.adobe.io/assets" + + def initialize(credentials = nil) + @credentials = credentials + end + + def get_presigned_url + response = api.post(PRESIGNED_URL_ENDPOINT, json: { mediaType: "application/pdf" }) + if response.status == 200 + JSON.parse(response.body.to_s) + else + Result.new(nil, "Unexpected response status from get presigned url: #{response.status}") + end + end + + def upload_asset(source_pdf) + presigned_url = get_presigned_url() + upload_uri = presigned_url["uploadUri"] + asset_id = presigned_url["assetID"] + aws = HTTP.headers({ "Content-Type": "application/pdf" }) + response = aws.put(upload_uri, body: File.open(source_pdf)) + if response.status == 200 + asset_id + else + Result.new(nil, "Unexpected response status from asset upload: #{response.status}") + end + end + + def delete_the_asset(asset_id) + api.delete("#{ASSETS_ENDPOINT}/#{asset_id}") + end + + def execute(source_pdf) + asset_id = upload_asset(source_pdf) + response = api.post(OCR_ENDPOINT, json: { "assetID": asset_id }) + if response.status == 201 + document_url = response.headers["location"] + poll_document_result(document_url, asset_id) + else + Result.new(nil, "Unexpected response status from ocr endpoint: #{response.status}\nasset_id: #{asset_id}") + end + end + + private + + def api_headers + { + Authorization: "Bearer #{JwtProvider.get_jwt(@credentials)}", + "x-api-key": @credentials.client_id, + "Content-Type": "application/json" + } + end + + def api + @api ||= HTTP.headers(api_headers) + end + + def poll_document_result(url, original_asset_id) + sleep(1) + response = api.get(url) + if response.status == 200 + json_response = JSON.parse(response.body.to_s) + ocr_asset_id = json_response&.[]("asset")&.[]("assetID") + case json_response["status"] + when "in progress" + poll_document_result(url, original_asset_id) + when "done" + # download_the_asset + response = HTTP.get(json_response["asset"]["downloadUri"]) + # delete the assets + delete_the_asset(original_asset_id) if original_asset_id.present? + delete_the_asset(ocr_asset_id) if ocr_asset_id.present? + # return the result + Result.new(response.body, nil) + when "failed" + # delete the original asset + delete_the_asset(original_asset_id) if original_asset_id.present? + Result.new(nil, "OCR Failed") + else + # delete the original asset + delete_the_asset(original_asset_id) if original_asset_id.present? + Result.new(nil, "Unexpected status from polling: #{json_response["status"]}") + end + else + # delete the original asset + delete_the_asset(original_asset_id) if original_asset_id.present? + Result.new(nil, "Unexpected response status from polling: #{json_response["status"]}") + end + end + end + end +end diff --git a/lib/pdfservices/ocr/result.rb b/lib/pdfservices/ocr/result.rb new file mode 100644 index 0000000..90f4266 --- /dev/null +++ b/lib/pdfservices/ocr/result.rb @@ -0,0 +1,24 @@ +require "json" +require "multipart_parser/reader" + +module PdfServices + module Ocr + class Result + attr_accessor :document_body, :error + + def initialize(document_body, error) + @document_body = document_body + @error = error + end + + def success? + @document_body != nil + end + + def save_as_file(file_path) + location = File.join(Dir.pwd, file_path) + File.write(location, @document_body) + end + end + end +end diff --git a/lib/pdfservices/version.rb b/lib/pdfservices/version.rb index f4a5a35..39032cc 100644 --- a/lib/pdfservices/version.rb +++ b/lib/pdfservices/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module PdfServices - VERSION = "0.1.1" + VERSION = "0.1.2" end diff --git a/test/fixtures/files/fake_ocr_done.pdf b/test/fixtures/files/fake_ocr_done.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1344874964a91804eb152e91365a0a0345b6ef7a GIT binary patch literal 23 ccmXTP$ShU>qO`>9RE7NHBJ~u7f|N8a0Ag?lzW@LL literal 0 HcmV?d00001 diff --git a/test/fixtures/files/not_yet_ocr.pdf b/test/fixtures/files/not_yet_ocr.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8d3068e31c42aea6f912837658ab0058bfbfe19b GIT binary patch literal 21530 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 KK!IM2#Qy+|%Bb`J literal 0 HcmV?d00001 diff --git a/test/fixtures/ocr_done.json b/test/fixtures/ocr_done.json new file mode 100644 index 0000000..e85e094 --- /dev/null +++ b/test/fixtures/ocr_done.json @@ -0,0 +1,3 @@ +{ + "status": "in progress" +} diff --git a/test/fixtures/ocr_in_progress.json b/test/fixtures/ocr_in_progress.json new file mode 100644 index 0000000..c35e347 --- /dev/null +++ b/test/fixtures/ocr_in_progress.json @@ -0,0 +1,7 @@ +{ + "status": "done", + "asset": { + "assetID": "ocr'd:asset-id", + "downloadUri": "https://ocr.file.url" + } +} diff --git a/test/fixtures/presigned_upload_url_response.json b/test/fixtures/presigned_upload_url_response.json new file mode 100644 index 0000000..21751bc --- /dev/null +++ b/test/fixtures/presigned_upload_url_response.json @@ -0,0 +1,4 @@ +{ + "assetID": "urn:a-real-long-asset-asset-id", + "uploadUri": "https://a.presigned.url" +} diff --git a/test/integration_spikes/ocr.rb b/test/integration_spikes/ocr.rb new file mode 100644 index 0000000..b7cc334 --- /dev/null +++ b/test/integration_spikes/ocr.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require "lib/pdfservices" + +credentials = ::PdfServices::CredentialsBuilder.new + .with_client_id(ENV["PDF_SERVICES_CLIENT_ID"]) + .with_client_secret(ENV["PDF_SERVICES_CLIENT_SECRET"]) + .with_organization_id(ENV["PDF_SERVICES_ORGANIZATION_ID"]) + .with_account_id(ENV["PDF_SERVICES_ACCOUNT_ID"]) + .with_private_key(ENV["PDF_SERVICES_PRIVATE_KEY"]) + .build + +operation = ::PdfServices::Ocr::Operation.new(credentials) + +result = operation.execute("test/fixtures/files/not_yet_ocr.pdf") + +puts(result.error) + +result.save_as_file("tmp/ocr_result.pdf") diff --git a/test/pdf_services_sdk/test_integration.rb b/test/pdf_services_sdk/test_document_merge.rb similarity index 97% rename from test/pdf_services_sdk/test_integration.rb rename to test/pdf_services_sdk/test_document_merge.rb index 9f93194..76165de 100644 --- a/test/pdf_services_sdk/test_integration.rb +++ b/test/pdf_services_sdk/test_document_merge.rb @@ -2,7 +2,7 @@ require "test_helper" -class IntegrationTest < Minitest::Test +class DocumentMergeTest < Minitest::Test def test_it_works stub_valid_response_sequence diff --git a/test/pdf_services_sdk/test_ocr.rb b/test/pdf_services_sdk/test_ocr.rb new file mode 100644 index 0000000..8d4f147 --- /dev/null +++ b/test/pdf_services_sdk/test_ocr.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +require "test_helper" + +class OcrTest < Minitest::Test + def test_it_works + stub_valid_response_sequence + + # Initial setup, create credentials instance. + credentials = valid_credentials + + # source file + source_pdf_path = File.join(Dir.pwd, "test", "fixtures", "files", "not_yet_ocr.pdf") + + operation = ::PdfServices::Ocr::Operation.new(credentials) + + # Execute the operation + result = operation.execute(source_pdf_path) + + assert result.success? + assert_equal "this is fake ocr'd pdf\n", result.document_body.to_s + end + + private + + def stub_valid_response_sequence + # get JWT for requests + stub_request(:post, "https://ims-na1.adobelogin.com/ims/exchange/jwt/") + .to_return(status: 200, body: json_fixture("valid_jwt_response")) + + # get a presigned url to upload the source pdf + stub_request(:post, "https://pdf-services.adobe.io/assets") + .with(headers: secured_headers) + .to_return( + status: 200, + headers: json_headers, + body: json_fixture("presigned_upload_url_response") + ) + + # upload the source pdf + stub_request(:put, "https://a.presigned.url").to_return(status: 200) + + # request the OCR operation + stub_request(:post, "https://pdf-services.adobe.io/operation/ocr") + .with(headers: secured_headers) + .to_return( + status: 201, + headers: {"location" => "https://some.polling.url"}.merge(json_headers) + ) + + # poll for the result + stub_request(:get, "https://some.polling.url") + .with(headers: secured_headers) + .to_return(status: 200, headers: json_headers, body: json_fixture("ocr_in_progress")) + .to_return(status: 200, headers: json_headers, body: json_fixture("ocr_in_progress")) + .to_return(status: 200, headers: json_headers, body: json_fixture("ocr_done")) + + # download the ocr'd pdf + stub_request(:get, "https://ocr.file.url") + .to_return(status: 200, headers: pdf_headers, body: file_fixture("fake_ocr_done.pdf")) + + # delete the original asset + stub_request(:delete, "https://pdf-services.adobe.io/assets/urn:a-real-long-asset-asset-id") + .with(headers: secured_headers) + .to_return(status: 200, body: "", headers: {}) + + # delete the ocr'd asset + stub_request(:delete, "https://pdf-services.adobe.io/assets/ocr'd:asset-id") + .with(headers: secured_headers) + .to_return(status: 200, body: "", headers: {}) + end + + def secured_headers + { + "Authorization": "Bearer fake1.fake2.fake3", + "Content-Type": "application/json", + "X-Api-Key": "123someclientid" + } + end + + def json_headers + {"Content-Type" => "application/json;charset=UTF-8"} + end + + def pdf_headers + {"Content-Type" => "application/pdf"} + end +end From 84514660039f85f3115e86189f9f4c8add62fbc6 Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Mon, 23 Jan 2023 11:59:02 -0500 Subject: [PATCH 2/4] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7204c3b..f302dbc 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Then you need to create a json file with your credentials: ``` ### Supported API calls: -- Document merge. See `test/pdf_services_sdk/test_integration.rb` for an example usage. +- Document merge. See `test/pdf_services_sdk/test_document_merge.rb` for an example usage. - OCR. See `test/pdf_services_sdk/test_ocr.rb` for an example usage. ## Development From df388138306cf7a41995779f4ccc3422ff8b9f46 Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Mon, 23 Jan 2023 15:55:25 -0500 Subject: [PATCH 3/4] TIL the version matters for the gemlock --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6383c1d..5e720dc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - pdfservices (0.1.1) + pdfservices (0.1.2) http (~> 5.1) json (~> 2.6) jwt (>= 1.0, < 3.0) @@ -22,7 +22,7 @@ GEM ffi (>= 1.0.0) rake hashdiff (1.0.1) - http (5.1.0) + http (5.1.1) addressable (~> 2.8) http-cookie (~> 1.0) http-form_data (~> 2.2) @@ -31,7 +31,7 @@ GEM domain_name (~> 0.5) http-form_data (2.3.0) json (2.6.2) - jwt (2.5.0) + jwt (2.6.0) llhttp-ffi (0.4.0) ffi-compiler (~> 1.0) rake (~> 13.0) @@ -74,9 +74,9 @@ GEM hashdiff (>= 0.4.0, < 2.0.0) PLATFORMS + arm64-darwin-21 ruby x86_64-linux - arm64-darwin-21 DEPENDENCIES minitest (~> 5.0) From ad3b729b4383ddf106e577f6d90bdef26ba7f665 Mon Sep 17 00:00:00 2001 From: Jimmy Bosse Date: Mon, 23 Jan 2023 16:02:07 -0500 Subject: [PATCH 4/4] Greening --- lib/pdfservices/ocr/operation.rb | 16 ++++++++-------- test/pdf_services_sdk/test_ocr.rb | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/pdfservices/ocr/operation.rb b/lib/pdfservices/ocr/operation.rb index c1561f1..83e20f2 100644 --- a/lib/pdfservices/ocr/operation.rb +++ b/lib/pdfservices/ocr/operation.rb @@ -17,7 +17,7 @@ def initialize(credentials = nil) end def get_presigned_url - response = api.post(PRESIGNED_URL_ENDPOINT, json: { mediaType: "application/pdf" }) + response = api.post(PRESIGNED_URL_ENDPOINT, json: {mediaType: "application/pdf"}) if response.status == 200 JSON.parse(response.body.to_s) else @@ -26,10 +26,10 @@ def get_presigned_url end def upload_asset(source_pdf) - presigned_url = get_presigned_url() + presigned_url = get_presigned_url upload_uri = presigned_url["uploadUri"] asset_id = presigned_url["assetID"] - aws = HTTP.headers({ "Content-Type": "application/pdf" }) + aws = HTTP.headers({"Content-Type": "application/pdf"}) response = aws.put(upload_uri, body: File.open(source_pdf)) if response.status == 200 asset_id @@ -44,7 +44,7 @@ def delete_the_asset(asset_id) def execute(source_pdf) asset_id = upload_asset(source_pdf) - response = api.post(OCR_ENDPOINT, json: { "assetID": asset_id }) + response = api.post(OCR_ENDPOINT, json: {assetID: asset_id}) if response.status == 201 document_url = response.headers["location"] poll_document_result(document_url, asset_id) @@ -71,7 +71,7 @@ def poll_document_result(url, original_asset_id) sleep(1) response = api.get(url) if response.status == 200 - json_response = JSON.parse(response.body.to_s) + json_response = JSON.parse(response.body.to_s) ocr_asset_id = json_response&.[]("asset")&.[]("assetID") case json_response["status"] when "in progress" @@ -80,13 +80,13 @@ def poll_document_result(url, original_asset_id) # download_the_asset response = HTTP.get(json_response["asset"]["downloadUri"]) # delete the assets - delete_the_asset(original_asset_id) if original_asset_id.present? - delete_the_asset(ocr_asset_id) if ocr_asset_id.present? + delete_the_asset(original_asset_id) if !original_asset_id.nil? + delete_the_asset(ocr_asset_id) if !ocr_asset_id.nil? # return the result Result.new(response.body, nil) when "failed" # delete the original asset - delete_the_asset(original_asset_id) if original_asset_id.present? + delete_the_asset(original_asset_id) if !original_asset_id.nil? Result.new(nil, "OCR Failed") else # delete the original asset diff --git a/test/pdf_services_sdk/test_ocr.rb b/test/pdf_services_sdk/test_ocr.rb index 8d4f147..e890ac2 100644 --- a/test/pdf_services_sdk/test_ocr.rb +++ b/test/pdf_services_sdk/test_ocr.rb @@ -72,7 +72,7 @@ def stub_valid_response_sequence def secured_headers { - "Authorization": "Bearer fake1.fake2.fake3", + Authorization: "Bearer fake1.fake2.fake3", "Content-Type": "application/json", "X-Api-Key": "123someclientid" }