From c3ee5793597741e58230900337e1a801b3b20413 Mon Sep 17 00:00:00 2001 From: muskaang Date: Mon, 5 Dec 2022 16:13:10 +0530 Subject: [PATCH] "New rest api beta release 2.0.0b1" --- docs/build/doctrees/adobe.doctree | Bin 3458 -> 3561 bytes docs/build/doctrees/adobe.pdfservices.doctree | Bin 3612 -> 3715 bytes .../adobe.pdfservices.operation.auth.doctree | Bin 64259 -> 65636 bytes .../adobe.pdfservices.operation.doctree | Bin 49456 -> 55953 bytes ...be.pdfservices.operation.exception.doctree | Bin 35134 -> 36675 bytes .../adobe.pdfservices.operation.io.doctree | Bin 25323 -> 28209 bytes ...adobe.pdfservices.operation.pdfops.doctree | Bin 32584 -> 36283 bytes ...fservices.operation.pdfops.options.doctree | Bin 3938 -> 4041 bytes ...peration.pdfops.options.extractpdf.doctree | Bin 94308 -> 97615 bytes docs/build/doctrees/environment.pickle | Bin 100059 -> 102853 bytes docs/build/doctrees/index.doctree | Bin 3056 -> 3143 bytes docs/build/doctrees/modules.doctree | Bin 2549 -> 2636 bytes docs/build/doctrees/reference/index.doctree | Bin 345734 -> 373642 bytes docs/build/html/.buildinfo | 2 +- docs/build/html/_static/basic.css | 114 +- docs/build/html/_static/doctools.js | 14 +- docs/build/html/_static/language_data.js | 6 +- docs/build/html/_static/searchtools.js | 43 +- docs/build/html/_static/underscore-1.13.1.js | 2042 +++++++++++++++++ docs/build/html/_static/underscore.js | 37 +- docs/build/html/adobe.html | 16 +- docs/build/html/adobe.pdfservices.html | 16 +- .../adobe.pdfservices.operation.auth.html | 114 +- ...adobe.pdfservices.operation.exception.html | 88 +- .../html/adobe.pdfservices.operation.html | 85 +- .../html/adobe.pdfservices.operation.io.html | 44 +- .../adobe.pdfservices.operation.pdfops.html | 58 +- ...s.operation.pdfops.options.extractpdf.html | 130 +- ....pdfservices.operation.pdfops.options.html | 16 +- docs/build/html/genindex.html | 74 +- docs/build/html/index.html | 12 +- docs/build/html/modules.html | 12 +- docs/build/html/objects.inv | Bin 1460 -> 1521 bytes docs/build/html/py-modindex.html | 10 +- docs/build/html/reference/index.html | 560 +++-- docs/build/html/search.html | 10 +- docs/build/html/searchindex.js | 2 +- setup.py | 2 +- .../auth/service_account_credentials.py | 2 +- .../pdfservices/operation/client_config.py | 34 +- .../internal/api/dto/request/__init__.py | 9 + .../dto/request/asset_upload_uri_request.py | 29 + .../request/autotagpdf/autotag_pdf_request.py | 38 + .../api/dto/request/extract_pdf_request.py | 57 + .../api/dto/request/platform/__init__.py | 9 + .../request/platform/platform_api_request.py | 16 + .../internal/api/dto/response/__init__.py | 9 + .../internal/api/dto/response/job_status.py | 19 + .../api/dto/response/platform/__init__.py | 9 + .../response/platform/job_error_response.py | 30 + .../platform/platform_api_response.py | 39 + .../operation/internal/api/platform_api.py | 99 + .../operation/internal/api/storage_api.py | 107 + .../internal/auth/jwt_authenticator.py | 9 +- .../operation/internal/constants/__init__.py | 0 .../internal/constants/request_key.py | 21 + .../internal/constants/service_constants.py | 59 + .../internal/extension_media_type_mapping.py | 1 + .../operation/internal/http/http_client.py | 39 +- .../operation/internal/http/http_request.py | 3 +- .../operation/internal/http/response_util.py | 41 +- .../internal/internal_client_config.py | 16 +- .../internal/internal_execution_context.py | 2 - .../operation/internal/io/file_ref_impl.py | 7 +- .../response/asset_upload_uri_response.py | 28 + .../internal/service/autotag_pdf_service.py | 51 + .../internal/service/extract_pdf_service.py | 44 + .../operation/internal/util/file_utils.py | 6 - .../operation/internal/util/path_util.py | 2 +- .../pdfservices/operation/io/file_ref.py | 9 +- .../operation/pdfops/autotag_pdf_operation.py | 47 +- .../operation/pdfops/extract_pdf_operation.py | 39 +- 72 files changed, 3698 insertions(+), 739 deletions(-) create mode 100644 docs/build/html/_static/underscore-1.13.1.js create mode 100644 src/adobe/pdfservices/operation/internal/api/dto/request/asset_upload_uri_request.py create mode 100644 src/adobe/pdfservices/operation/internal/api/dto/request/autotagpdf/autotag_pdf_request.py create mode 100644 src/adobe/pdfservices/operation/internal/api/dto/request/extract_pdf_request.py create mode 100644 src/adobe/pdfservices/operation/internal/api/dto/request/platform/platform_api_request.py create mode 100644 src/adobe/pdfservices/operation/internal/api/dto/response/job_status.py create mode 100644 src/adobe/pdfservices/operation/internal/api/dto/response/platform/job_error_response.py create mode 100644 src/adobe/pdfservices/operation/internal/api/dto/response/platform/platform_api_response.py create mode 100644 src/adobe/pdfservices/operation/internal/api/platform_api.py create mode 100644 src/adobe/pdfservices/operation/internal/api/storage_api.py create mode 100644 src/adobe/pdfservices/operation/internal/constants/__init__.py create mode 100644 src/adobe/pdfservices/operation/internal/constants/request_key.py create mode 100644 src/adobe/pdfservices/operation/internal/constants/service_constants.py create mode 100644 src/adobe/pdfservices/operation/internal/response/asset_upload_uri_response.py create mode 100644 src/adobe/pdfservices/operation/internal/service/autotag_pdf_service.py create mode 100644 src/adobe/pdfservices/operation/internal/service/extract_pdf_service.py diff --git a/docs/build/doctrees/adobe.doctree b/docs/build/doctrees/adobe.doctree index 5a0de546694e12ffb143e9ebbe4099adf8bfc349..a59348cb777a3d9a957e08786c07069208a5d807 100644 GIT binary patch delta 261 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 z
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 J0n8?p|1U+#w^RTC literal 64259 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 diff --git a/docs/build/doctrees/adobe.pdfservices.operation.doctree b/docs/build/doctrees/adobe.pdfservices.operation.doctree index 52a7adfa893876b85d0b78f27f568260d0f9bb73..502849022dadf7606261d2242d4f905b6a364af3 100644 GIT binary patch literal 55953 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 literal 49456 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 literal 35134 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 GQ~wWm5MO!# diff --git a/docs/build/doctrees/adobe.pdfservices.operation.io.doctree b/docs/build/doctrees/adobe.pdfservices.operation.io.doctree index affec6ae950edecbdcae182bfe8f39c60fae4dde..7cf5461cc2aea9e9e7e67e7ceb24865025530343 100644 GIT binary patch literal 28209 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 literal 32584 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 delta 160 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 PMG1Y@%)LupG~@pd{c+|u literal 94308 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 diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index c39d0fdc54caf0a7987f4d34764f8fa89bf72d7c..ac25958ffa0df07fb359adac9768650d148180ea 100644 GIT binary patch literal 102853 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 GsQiBmaT3V@ literal 100059 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 E1FVcVs{jB1 diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree index a1497b72db114a56ef3e0d0a970a32a9a98bb1f5..8c28207ce1026239d3115ebab76f22284250b768 100644 GIT binary patch delta 181 zcmew$eq4gJfpw}4&qh{HMmbmg(BjmhV*T9G;_Sr4ymbAf)RM%4%94!yyyBGX%_)q1 z?22j`B_##LR{HuWi6x08MTyDTsYQC3sU>N8`9u@j;xmfpzLr?v1RTjAFL>p~b01#rkE5nMoOmW!d_UDfvmMn{ycZ*u`ZsN=gcf zt@QOv^7C_w^)gdS()99+(kDxE{+q1HrMo$sD~XYZBQqtwxFoTtWQsTAhUL#F@$ delta 96 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 diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo index b405a1f..62ade7c 100644 --- a/docs/build/html/.buildinfo +++ b/docs/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: f5a268b1476d9649e6c21de12718916e +config: 5a4c3b86d3c73856c73b6ffb54655fd5 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css index be19270..bf18350 100644 --- a/docs/build/html/_static/basic.css +++ b/docs/build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -130,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -277,25 +277,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +img.align-left, figure.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, .figure.align-right, object.align-right { +img.align-right, figure.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, .figure.align-center, object.align-center { +img.align-center, figure.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } -img.align-default, .figure.align-default { +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -319,7 +319,8 @@ img.align-default, .figure.align-default { /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px; @@ -377,12 +378,14 @@ div.body p.centered { /* -- content of sidebars/topics/admonitions -------------------------------- */ div.sidebar > :last-child, +aside.sidebar > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; } div.sidebar::after, +aside.sidebar::after, div.topic::after, div.admonition::after, blockquote::after { @@ -455,20 +458,22 @@ td > :last-child { /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -503,6 +508,63 @@ table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -629,14 +691,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -677,8 +731,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -702,6 +757,7 @@ span.pre { -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; } div[class*="highlight-"] { @@ -765,8 +821,12 @@ div.code-block-caption code { table.highlighttable td.linenos, span.linenos, -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -781,16 +841,6 @@ div.literal-block-wrapper { margin: 1em 0; } -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - code.xref, a code { background-color: transparent; font-weight: bold; diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js index 144884e..e509e48 100644 --- a/docs/build/html/_static/doctools.js +++ b/docs/build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -29,9 +29,14 @@ if (!window.console || !console.firebug) { /** * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); }; /** @@ -259,6 +264,9 @@ var Documentation = { hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); + var url = new URL(window.location); + url.searchParams.delete('highlight'); + window.history.replaceState({}, '', url); }, /** @@ -296,12 +304,14 @@ var Documentation = { window.location.href = prevHref; return false; } + break; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } + break; } } }); diff --git a/docs/build/html/_static/language_data.js b/docs/build/html/_static/language_data.js index 0e7dc7e..ebe2f03 100644 --- a/docs/build/html/_static/language_data.js +++ b/docs/build/html/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -13,7 +13,8 @@ var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; -/* Non-minified version JS is _stemmer.js if file is provided */ +/* Non-minified version is copied as a separate JS file, is available */ + /** * Porter Stemmer */ @@ -199,7 +200,6 @@ var Stemmer = function() { - var splitChars = (function() { var result = {}; var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, diff --git a/docs/build/html/_static/searchtools.js b/docs/build/html/_static/searchtools.js index 6fc9e7f..2d77859 100644 --- a/docs/build/html/_static/searchtools.js +++ b/docs/build/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -248,7 +248,7 @@ var Search = { // results left, load the summary and display it if (results.length) { var item = results.pop(); - var listItem = $('
  • '); + var listItem = $('
  • '); var requestUrl = ""; var linkUrl = ""; if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') { @@ -273,28 +273,31 @@ var Search = { if (item[3]) { listItem.append($(' (' + item[3] + ')')); Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { $.ajax({url: requestUrl, dataType: "text", complete: function(jqxhr, textstatus) { var data = jqxhr.responseText; if (data !== '' && data !== undefined) { - listItem.append(Search.makeSearchSummary(data, searchterms, hlterms)); + var summary = Search.makeSearchSummary(data, searchterms, hlterms); + if (summary) { + listItem.append(summary); + } } Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); }}); } else { // no source available, just display title Search.output.append(listItem); - listItem.slideDown(5, function() { + setTimeout(function() { displayNextItem(); - }); + }, 5); } } // search finished, update title and status message @@ -325,7 +328,9 @@ var Search = { var results = []; for (var prefix in objects) { - for (var name in objects[prefix]) { + for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) { + var match = objects[prefix][iMatch]; + var name = match[4]; var fullname = (prefix ? prefix + '.' : '') + name; var fullnameLower = fullname.toLowerCase() if (fullnameLower.indexOf(object) > -1) { @@ -339,7 +344,6 @@ var Search = { } else if (parts[parts.length - 1].indexOf(object) > -1) { score += Scorer.objPartialMatch; } - var match = objects[prefix][name]; var objname = objnames[match[1]][2]; var title = titles[match[0]]; // If more than one term searched for, we require other words to be @@ -379,6 +383,13 @@ var Search = { return results; }, + /** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions + */ + escapeRegExp : function(string) { + return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + }, + /** * search for full-text terms in the index */ @@ -402,13 +413,14 @@ var Search = { ]; // add support for partial matches if (word.length > 2) { + var word_regex = this.escapeRegExp(word); for (var w in terms) { - if (w.match(word) && !terms[word]) { + if (w.match(word_regex) && !terms[word]) { _o.push({files: terms[w], score: Scorer.partialTerm}) } } for (var w in titleterms) { - if (w.match(word) && !titleterms[word]) { + if (w.match(word_regex) && !titleterms[word]) { _o.push({files: titleterms[w], score: Scorer.partialTitle}) } } @@ -490,6 +502,9 @@ var Search = { */ makeSearchSummary : function(htmlText, keywords, hlwords) { var text = Search.htmlToText(htmlText); + if (text == "") { + return null; + } var textLower = text.toLowerCase(); var start = 0; $.each(keywords, function() { @@ -501,7 +516,7 @@ var Search = { var excerpt = ((start > 0) ? '...' : '') + $.trim(text.substr(start, 240)) + ((start + 240 - text.length) ? '...' : ''); - var rv = $('
    ').text(excerpt); + var rv = $('

    ').text(excerpt); $.each(hlwords, function() { rv = rv.highlightText(this, 'highlighted'); }); diff --git a/docs/build/html/_static/underscore-1.13.1.js b/docs/build/html/_static/underscore-1.13.1.js new file mode 100644 index 0000000..ffd77af --- /dev/null +++ b/docs/build/html/_static/underscore-1.13.1.js @@ -0,0 +1,2042 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('underscore', factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { + var current = global._; + var exports = global._ = factory(); + exports.noConflict = function () { global._ = current; return exports; }; + }())); +}(this, (function () { + // Underscore.js 1.13.1 + // https://underscorejs.org + // (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + // Current version. + var VERSION = '1.13.1'; + + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = typeof self == 'object' && self.self === self && self || + typeof global == 'object' && global.global === global && global || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + // Some functions take a variable number of arguments, or a few expected + // arguments at the beginning and then a variable number of values to operate + // on. This helper accumulates all remaining arguments past the function’s + // argument length (or an explicit `startIndex`), into an array that becomes + // the last argument. Similar to ES6’s "rest parameter". + function restArguments(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + } + + // Is a given variable an object? + function isObject(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + } + + // Is a given value equal to null? + function isNull(obj) { + return obj === null; + } + + // Is a given variable undefined? + function isUndefined(obj) { + return obj === void 0; + } + + // Is a given value a boolean? + function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + } + + // Is a given value a DOM element? + function isElement(obj) { + return !!(obj && obj.nodeType === 1); + } + + // Internal function for creating a `toString`-based type tester. + function tagTester(name) { + var tag = '[object ' + name + ']'; + return function(obj) { + return toString.call(obj) === tag; + }; + } + + var isString = tagTester('String'); + + var isNumber = tagTester('Number'); + + var isDate = tagTester('Date'); + + var isRegExp = tagTester('RegExp'); + + var isError = tagTester('Error'); + + var isSymbol = tagTester('Symbol'); + + var isArrayBuffer = tagTester('ArrayBuffer'); + + var isFunction = tagTester('Function'); + + // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old + // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { + isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + var isFunction$1 = isFunction; + + var hasObjectTag = tagTester('Object'); + + // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. + // In IE 11, the most common among them, this problem also applies to + // `Map`, `WeakMap` and `Set`. + var hasStringTagBug = ( + supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) + ), + isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); + + var isDataView = tagTester('DataView'); + + // In IE 10 - Edge 13, we need a different heuristic + // to determine whether an object is a `DataView`. + function ie10IsDataView(obj) { + return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); + } + + var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); + + // Is a given value an array? + // Delegates to ECMA5's native `Array.isArray`. + var isArray = nativeIsArray || tagTester('Array'); + + // Internal function to check whether `key` is an own property name of `obj`. + function has$1(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + } + + var isArguments = tagTester('Arguments'); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + (function() { + if (!isArguments(arguments)) { + isArguments = function(obj) { + return has$1(obj, 'callee'); + }; + } + }()); + + var isArguments$1 = isArguments; + + // Is a given object a finite number? + function isFinite$1(obj) { + return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); + } + + // Is the given value `NaN`? + function isNaN$1(obj) { + return isNumber(obj) && _isNaN(obj); + } + + // Predicate-generating function. Often useful outside of Underscore. + function constant(value) { + return function() { + return value; + }; + } + + // Common internal logic for `isArrayLike` and `isBufferLike`. + function createSizePropertyCheck(getSizeProperty) { + return function(collection) { + var sizeProperty = getSizeProperty(collection); + return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; + } + } + + // Internal helper to generate a function to obtain property `key` from `obj`. + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + // Internal helper to obtain the `byteLength` property of an object. + var getByteLength = shallowProperty('byteLength'); + + // Internal helper to determine whether we should spend extensive checks against + // `ArrayBuffer` et al. + var isBufferLike = createSizePropertyCheck(getByteLength); + + // Is a given value a typed array? + var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; + function isTypedArray(obj) { + // `ArrayBuffer.isView` is the most future-proof, so use it when available. + // Otherwise, fall back on the above regular expression. + return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : + isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); + } + + var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); + + // Internal helper to obtain the `length` property of an object. + var getLength = shallowProperty('length'); + + // Internal helper to create a simple lookup structure. + // `collectNonEnumProps` used to depend on `_.contains`, but this led to + // circular imports. `emulatedSet` is a one-off solution that only works for + // arrays of strings. + function emulatedSet(keys) { + var hash = {}; + for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; + return { + contains: function(key) { return hash[key]; }, + push: function(key) { + hash[key] = true; + return keys.push(key); + } + }; + } + + // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't + // be iterated by `for key in ...` and thus missed. Extends `keys` in place if + // needed. + function collectNonEnumProps(obj, keys) { + keys = emulatedSet(keys); + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = isFunction$1(constructor) && constructor.prototype || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + function keys(obj) { + if (!isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (has$1(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + function isEmpty(obj) { + if (obj == null) return true; + // Skip the more expensive `toString`-based type checks if `obj` has no + // `.length`. + var length = getLength(obj); + if (typeof length == 'number' && ( + isArray(obj) || isString(obj) || isArguments$1(obj) + )) return length === 0; + return getLength(keys(obj)) === 0; + } + + // Returns whether an object has a given set of `key:value` pairs. + function isMatch(object, attrs) { + var _keys = keys(attrs), length = _keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = _keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + } + + // If Underscore is called as a function, it returns a wrapped object that can + // be used OO-style. This wrapper holds altered versions of all functions added + // through `_.mixin`. Wrapped objects may be chained. + function _$1(obj) { + if (obj instanceof _$1) return obj; + if (!(this instanceof _$1)) return new _$1(obj); + this._wrapped = obj; + } + + _$1.VERSION = VERSION; + + // Extracts the result from a wrapped and chained object. + _$1.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxies for some methods used in engine operations + // such as arithmetic and JSON stringification. + _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; + + _$1.prototype.toString = function() { + return String(this._wrapped); + }; + + // Internal function to wrap or shallow-copy an ArrayBuffer, + // typed array or DataView to a new view, reusing the buffer. + function toBufferView(bufferSource) { + return new Uint8Array( + bufferSource.buffer || bufferSource, + bufferSource.byteOffset || 0, + getByteLength(bufferSource) + ); + } + + // We use this string twice, so give it a name for minification. + var tagDataView = '[object DataView]'; + + // Internal recursive comparison function for `_.isEqual`. + function eq(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + } + + // Internal recursive comparison function for `_.isEqual`. + function deepEq(a, b, aStack, bStack) { + // Unwrap any wrapped objects. + if (a instanceof _$1) a = a._wrapped; + if (b instanceof _$1) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + // Work around a bug in IE 10 - Edge 13. + if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { + if (!isDataView$1(b)) return false; + className = tagDataView; + } + switch (className) { + // These types are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + case '[object ArrayBuffer]': + case tagDataView: + // Coerce to typed array so we can fall through. + return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); + } + + var areArrays = className === '[object Array]'; + if (!areArrays && isTypedArray$1(a)) { + var byteLength = getByteLength(a); + if (byteLength !== getByteLength(b)) return false; + if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; + areArrays = true; + } + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && + isFunction$1(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var _keys = keys(a), key; + length = _keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = _keys[length]; + if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + } + + // Perform a deep comparison to check if two objects are equal. + function isEqual(a, b) { + return eq(a, b); + } + + // Retrieve all the enumerable property names of an object. + function allKeys(obj) { + if (!isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + } + + // Since the regular `Object.prototype.toString` type tests don't work for + // some types in IE 11, we use a fingerprinting heuristic instead, based + // on the methods. It's not great, but it's the best we got. + // The fingerprint method lists are defined below. + function ie11fingerprint(methods) { + var length = getLength(methods); + return function(obj) { + if (obj == null) return false; + // `Map`, `WeakMap` and `Set` have no enumerable keys. + var keys = allKeys(obj); + if (getLength(keys)) return false; + for (var i = 0; i < length; i++) { + if (!isFunction$1(obj[methods[i]])) return false; + } + // If we are testing against `WeakMap`, we need to ensure that + // `obj` doesn't have a `forEach` method in order to distinguish + // it from a regular `Map`. + return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); + }; + } + + // In the interest of compact minification, we write + // each string in the fingerprints only once. + var forEachName = 'forEach', + hasName = 'has', + commonInit = ['clear', 'delete'], + mapTail = ['get', hasName, 'set']; + + // `Map`, `WeakMap` and `Set` each have slightly different + // combinations of the above sublists. + var mapMethods = commonInit.concat(forEachName, mapTail), + weakMapMethods = commonInit.concat(mapTail), + setMethods = ['add'].concat(commonInit, forEachName, hasName); + + var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); + + var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); + + var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); + + var isWeakSet = tagTester('WeakSet'); + + // Retrieve the values of an object's properties. + function values(obj) { + var _keys = keys(obj); + var length = _keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[_keys[i]]; + } + return values; + } + + // Convert an object into a list of `[key, value]` pairs. + // The opposite of `_.object` with one argument. + function pairs(obj) { + var _keys = keys(obj); + var length = _keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [_keys[i], obj[_keys[i]]]; + } + return pairs; + } + + // Invert the keys and values of an object. The values must be serializable. + function invert(obj) { + var result = {}; + var _keys = keys(obj); + for (var i = 0, length = _keys.length; i < length; i++) { + result[obj[_keys[i]]] = _keys[i]; + } + return result; + } + + // Return a sorted list of the function names available on the object. + function functions(obj) { + var names = []; + for (var key in obj) { + if (isFunction$1(obj[key])) names.push(key); + } + return names.sort(); + } + + // An internal function for creating assigner functions. + function createAssigner(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + } + + // Extend a given object with all the properties in passed-in object(s). + var extend = createAssigner(allKeys); + + // Assigns a given object with all the own properties in the passed-in + // object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + var extendOwn = createAssigner(keys); + + // Fill in a given object with default properties. + var defaults = createAssigner(allKeys, true); + + // Create a naked function reference for surrogate-prototype-swapping. + function ctor() { + return function(){}; + } + + // An internal function for creating a new object that inherits from another. + function baseCreate(prototype) { + if (!isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + var Ctor = ctor(); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + } + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + function create(prototype, props) { + var result = baseCreate(prototype); + if (props) extendOwn(result, props); + return result; + } + + // Create a (shallow-cloned) duplicate of an object. + function clone(obj) { + if (!isObject(obj)) return obj; + return isArray(obj) ? obj.slice() : extend({}, obj); + } + + // Invokes `interceptor` with the `obj` and then returns `obj`. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + function tap(obj, interceptor) { + interceptor(obj); + return obj; + } + + // Normalize a (deep) property `path` to array. + // Like `_.iteratee`, this function can be customized. + function toPath$1(path) { + return isArray(path) ? path : [path]; + } + _$1.toPath = toPath$1; + + // Internal wrapper for `_.toPath` to enable minification. + // Similar to `cb` for `_.iteratee`. + function toPath(path) { + return _$1.toPath(path); + } + + // Internal function to obtain a nested property in `obj` along `path`. + function deepGet(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + } + + // Get the value of the (deep) property on `path` from `object`. + // If any property in `path` does not exist or if the value is + // `undefined`, return `defaultValue` instead. + // The `path` is normalized through `_.toPath`. + function get(object, path, defaultValue) { + var value = deepGet(object, toPath(path)); + return isUndefined(value) ? defaultValue : value; + } + + // Shortcut function for checking if an object has a given property directly on + // itself (in other words, not on a prototype). Unlike the internal `has` + // function, this public version can also traverse nested properties. + function has(obj, path) { + path = toPath(path); + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (!has$1(obj, key)) return false; + obj = obj[key]; + } + return !!length; + } + + // Keep the identity function around for default iteratees. + function identity(value) { + return value; + } + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + function matcher(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + } + + // Creates a function that, when passed an object, will traverse that object’s + // properties down the given `path`, specified as an array of keys or indices. + function property(path) { + path = toPath(path); + return function(obj) { + return deepGet(obj, path); + }; + } + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + function optimizeCb(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-argument case is omitted because we’re not using it. + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + } + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `_.identity`, + // an arbitrary callback, a property matcher, or a property accessor. + function baseIteratee(value, context, argCount) { + if (value == null) return identity; + if (isFunction$1(value)) return optimizeCb(value, context, argCount); + if (isObject(value) && !isArray(value)) return matcher(value); + return property(value); + } + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only `argCount` argument. + function iteratee(value, context) { + return baseIteratee(value, context, Infinity); + } + _$1.iteratee = iteratee; + + // The function we call internally to generate a callback. It invokes + // `_.iteratee` if overridden, otherwise `baseIteratee`. + function cb(value, context, argCount) { + if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); + return baseIteratee(value, context, argCount); + } + + // Returns the results of applying the `iteratee` to each element of `obj`. + // In contrast to `_.map` it returns an object. + function mapObject(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = keys(obj), + length = _keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = _keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Predicate-generating function. Often useful outside of Underscore. + function noop(){} + + // Generates a function for a given object that returns a given property. + function propertyOf(obj) { + if (obj == null) return noop; + return function(path) { + return get(obj, path); + }; + } + + // Run a function **n** times. + function times(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + } + + // Return a random integer between `min` and `max` (inclusive). + function random(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + } + + // A (possibly faster) way to get the current timestamp as an integer. + var now = Date.now || function() { + return new Date().getTime(); + }; + + // Internal helper to generate functions for escaping and unescaping strings + // to/from HTML interpolation. + function createEscaper(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + } + + // Internal list of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + + // Function for escaping strings to HTML interpolation. + var _escape = createEscaper(escapeMap); + + // Internal list of HTML entities for unescaping. + var unescapeMap = invert(escapeMap); + + // Function for unescaping strings from HTML interpolation. + var _unescape = createEscaper(unescapeMap); + + // By default, Underscore uses ERB-style template delimiters. Change the + // following template settings to use alternative delimiters. + var templateSettings = _$1.templateSettings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; + + // When customizing `_.templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + function escapeChar(match) { + return '\\' + escapes[match]; + } + + // In order to prevent third-party code injection through + // `_.templateSettings.variable`, we test it against the following regular + // expression. It is intentionally a bit more liberal than just matching valid + // identifiers, but still prevents possible loopholes through defaults or + // destructuring assignment. + var bareIdentifier = /^\s*(\w|\$)+\s*$/; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + function template(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = defaults({}, settings, _$1.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offset. + return match; + }); + source += "';\n"; + + var argument = settings.variable; + if (argument) { + // Insure against third-party code injection. (CVE-2021-23358) + if (!bareIdentifier.test(argument)) throw new Error( + 'variable is not a bare identifier: ' + argument + ); + } else { + // If a variable is not specified, place data values in local scope. + source = 'with(obj||{}){\n' + source + '}\n'; + argument = 'obj'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + var render; + try { + render = new Function(argument, '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _$1); + }; + + // Provide the compiled source as a convenience for precompilation. + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + } + + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + function result(obj, path, fallback) { + path = toPath(path); + var length = path.length; + if (!length) { + return isFunction$1(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = isFunction$1(prop) ? prop.call(obj) : prop; + } + return obj; + } + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + function uniqueId(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + } + + // Start chaining a wrapped Underscore object. + function chain(obj) { + var instance = _$1(obj); + instance._chain = true; + return instance; + } + + // Internal function to execute `sourceFunc` bound to `context` with optional + // `args`. Determines whether to execute a function as a constructor or as a + // normal function. + function executeBound(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (isObject(result)) return result; + return self; + } + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. `_` acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + var partial = restArguments(function(func, boundArgs) { + var placeholder = partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }); + + partial.placeholder = _$1; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). + var bind = restArguments(function(func, context, args) { + if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArguments(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); + + // Internal helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var isArrayLike = createSizePropertyCheck(getLength); + + // Internal implementation of a recursive `flatten` function. + function flatten$1(input, depth, strict, output) { + output = output || []; + if (!depth && depth !== 0) { + depth = Infinity; + } else if (depth <= 0) { + return output.concat(input); + } + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { + // Flatten current level of array or arguments object. + if (depth > 1) { + flatten$1(value, depth - 1, strict, output); + idx = output.length; + } else { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + } + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + var bindAll = restArguments(function(obj, keys) { + keys = flatten$1(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = bind(obj[key], obj); + } + return obj; + }); + + // Memoize an expensive function by storing its results. + function memoize(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + } + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + var delay = restArguments(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + var defer = partial(delay, _$1, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + function throttle(func, wait, options) { + var timeout, context, args, result; + var previous = 0; + if (!options) options = {}; + + var later = function() { + previous = options.leading === false ? 0 : now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + + var throttled = function() { + var _now = now(); + if (!previous && options.leading === false) previous = _now; + var remaining = wait - (_now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = _now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; + } + + // When a sequence of calls of the returned function ends, the argument + // function is triggered. The end of a sequence is defined by the `wait` + // parameter. If `immediate` is passed, the argument function will be + // triggered at the beginning of the sequence instead of at the end. + function debounce(func, wait, immediate) { + var timeout, previous, args, result, context; + + var later = function() { + var passed = now() - previous; + if (wait > passed) { + timeout = setTimeout(later, wait - passed); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + // This check is needed because `func` can recursively invoke `debounced`. + if (!timeout) args = context = null; + } + }; + + var debounced = restArguments(function(_args) { + context = this; + args = _args; + previous = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + if (immediate) result = func.apply(context, args); + } + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = args = context = null; + }; + + return debounced; + } + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + function wrap(func, wrapper) { + return partial(wrapper, func); + } + + // Returns a negated version of the passed-in predicate. + function negate(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + } + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + function compose() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + } + + // Returns a function that will only be executed on and after the Nth call. + function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + } + + // Returns a function that will only be executed up to (but not including) the + // Nth call. + function before(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + } + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + var once = partial(before, 2); + + // Returns the first key on an object that passes a truth test. + function findKey(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = keys(obj), key; + for (var i = 0, length = _keys.length; i < length; i++) { + key = _keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + } + + // Internal function to generate `_.findIndex` and `_.findLastIndex`. + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a truth test. + var findIndex = createPredicateIndexFinder(1); + + // Returns the last index on an array-like that passes a truth test. + var findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + function sortedIndex(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + } + + // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), isNaN$1); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + var indexOf = createIndexFinder(1, findIndex, sortedIndex); + + // Return the position of the last occurrence of an item in an array, + // or -1 if the item is not included in the array. + var lastIndexOf = createIndexFinder(-1, findLastIndex); + + // Return the first value which passes a truth test. + function find(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? findIndex : findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; + } + + // Convenience version of a common use case of `_.find`: getting the first + // object containing specific `key:value` pairs. + function findWhere(obj, attrs) { + return find(obj, matcher(attrs)); + } + + // The cornerstone for collection functions, an `each` + // implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + function each(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + for (i = 0, length = _keys.length; i < length; i++) { + iteratee(obj[_keys[i]], _keys[i], obj); + } + } + return obj; + } + + // Return the results of applying the iteratee to each element. + function map(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + } + + // Internal helper to create a reducing function, iterating left or right. + function createReduce(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[_keys ? _keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = _keys ? _keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + var reduce = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + var reduceRight = createReduce(-1); + + // Return all the elements that pass a truth test. + function filter(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + } + + // Return all the elements for which a truth test fails. + function reject(obj, predicate, context) { + return filter(obj, negate(cb(predicate)), context); + } + + // Determine whether all of the elements pass a truth test. + function every(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + } + + // Determine if at least one element in the object passes a truth test. + function some(obj, predicate, context) { + predicate = cb(predicate, context); + var _keys = !isArrayLike(obj) && keys(obj), + length = (_keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = _keys ? _keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + } + + // Determine if the array or object contains a given item (using `===`). + function contains(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return indexOf(obj, item, fromIndex) >= 0; + } + + // Invoke a method (with arguments) on every item in a collection. + var invoke = restArguments(function(obj, path, args) { + var contextPath, func; + if (isFunction$1(path)) { + func = path; + } else { + path = toPath(path); + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); + }); + }); + + // Convenience version of a common use case of `_.map`: fetching a property. + function pluck(obj, key) { + return map(obj, property(key)); + } + + // Convenience version of a common use case of `_.filter`: selecting only + // objects containing specific `key:value` pairs. + function where(obj, attrs) { + return filter(obj, matcher(attrs)); + } + + // Return the maximum element (or element-based computation). + function max(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Return the minimum element (or element-based computation). + function min(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { + obj = isArrayLike(obj) ? obj : values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = v; + lastComputed = computed; + } + }); + } + return result; + } + + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `_.map`. + function sample(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = values(obj); + return obj[random(obj.length - 1)]; + } + var sample = isArrayLike(obj) ? clone(obj) : values(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); + } + + // Shuffle a collection. + function shuffle(obj) { + return sample(obj, Infinity); + } + + // Sort the object's values by a criterion produced by an iteratee. + function sortBy(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return pluck(map(obj, function(value, key, list) { + return { + value: value, + index: index++, + criteria: iteratee(value, key, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + } + + // An internal function used for aggregate "group by" operations. + function group(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + } + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + var groupBy = group(function(result, value, key) { + if (has$1(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `_.groupBy`, but for + // when you know that your index values will be unique. + var indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + var countBy = group(function(result, value, key) { + if (has$1(result, key)) result[key]++; else result[key] = 1; + }); + + // Split a collection into two arrays: one whose elements all pass the given + // truth test, and one whose elements all do not pass the truth test. + var partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + + // Safely create a real, live array from anything iterable. + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; + function toArray(obj) { + if (!obj) return []; + if (isArray(obj)) return slice.call(obj); + if (isString(obj)) { + // Keep surrogate pair characters together. + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return map(obj, identity); + return values(obj); + } + + // Return the number of elements in a collection. + function size(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : keys(obj).length; + } + + // Internal `_.pick` helper function to determine whether `key` is an enumerable + // property name of `obj`. + function keyInObj(value, key, obj) { + return key in obj; + } + + // Return a copy of the object only containing the allowed properties. + var pick = restArguments(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (isFunction$1(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten$1(keys, false, false); + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the disallowed properties. + var omit = restArguments(function(obj, keys) { + var iteratee = keys[0], context; + if (isFunction$1(iteratee)) { + iteratee = negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = map(flatten$1(keys, false, false), String); + iteratee = function(value, key) { + return !contains(keys, key); + }; + } + return pick(obj, iteratee, context); + }); + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + function initial(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + } + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. The **guard** check allows it to work with `_.map`. + function first(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[0]; + return initial(array, array.length - n); + } + + // Returns everything but the first entry of the `array`. Especially useful on + // the `arguments` object. Passing an **n** will return the rest N values in the + // `array`. + function rest(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + } + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + function last(array, n, guard) { + if (array == null || array.length < 1) return n == null || guard ? void 0 : []; + if (n == null || guard) return array[array.length - 1]; + return rest(array, Math.max(0, array.length - n)); + } + + // Trim out all falsy values from an array. + function compact(array) { + return filter(array, Boolean); + } + + // Flatten out an array, either recursively (by default), or up to `depth`. + // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. + function flatten(array, depth) { + return flatten$1(array, depth, false); + } + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + var difference = restArguments(function(array, rest) { + rest = flatten$1(rest, true, true); + return filter(array, function(value){ + return !contains(rest, value); + }); + }); + + // Return a version of the array that does not contain the specified value(s). + var without = restArguments(function(array, otherArrays) { + return difference(array, otherArrays); + }); + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // The faster algorithm will not work with an iteratee if the iteratee + // is not a one-to-one function, so providing an iteratee will disable + // the faster algorithm. + function uniq(array, isSorted, iteratee, context) { + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted && !iteratee) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!contains(result, value)) { + result.push(value); + } + } + return result; + } + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + var union = restArguments(function(arrays) { + return uniq(flatten$1(arrays, true, true)); + }); + + // Produce an array that contains every item shared between all the + // passed-in arrays. + function intersection(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + } + + // Complement of zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + function unzip(array) { + var length = array && max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = pluck(array, index); + } + return result; + } + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + var zip = restArguments(unzip); + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. Passing by pairs is the reverse of `_.pairs`. + function object(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + } + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](https://docs.python.org/library/functions.html#range). + function range(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + if (!step) { + step = stop < start ? -1 : 1; + } + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + } + + // Chunk a single array into multiple arrays, each containing `count` or fewer + // items. + function chunk(array, count) { + if (count == null || count < 1) return []; + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + } + + // Helper function to continue chaining intermediate results. + function chainResult(instance, obj) { + return instance._chain ? _$1(obj).chain() : obj; + } + + // Add your own custom functions to the Underscore object. + function mixin(obj) { + each(functions(obj), function(name) { + var func = _$1[name] = obj[name]; + _$1.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_$1, args)); + }; + }); + return _$1; + } + + // Add all mutator `Array` functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) { + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) { + delete obj[0]; + } + } + return chainResult(this, obj); + }; + }); + + // Add all accessor `Array` functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _$1.prototype[name] = function() { + var obj = this._wrapped; + if (obj != null) obj = method.apply(obj, arguments); + return chainResult(this, obj); + }; + }); + + // Named Exports + + var allExports = { + __proto__: null, + VERSION: VERSION, + restArguments: restArguments, + isObject: isObject, + isNull: isNull, + isUndefined: isUndefined, + isBoolean: isBoolean, + isElement: isElement, + isString: isString, + isNumber: isNumber, + isDate: isDate, + isRegExp: isRegExp, + isError: isError, + isSymbol: isSymbol, + isArrayBuffer: isArrayBuffer, + isDataView: isDataView$1, + isArray: isArray, + isFunction: isFunction$1, + isArguments: isArguments$1, + isFinite: isFinite$1, + isNaN: isNaN$1, + isTypedArray: isTypedArray$1, + isEmpty: isEmpty, + isMatch: isMatch, + isEqual: isEqual, + isMap: isMap, + isWeakMap: isWeakMap, + isSet: isSet, + isWeakSet: isWeakSet, + keys: keys, + allKeys: allKeys, + values: values, + pairs: pairs, + invert: invert, + functions: functions, + methods: functions, + extend: extend, + extendOwn: extendOwn, + assign: extendOwn, + defaults: defaults, + create: create, + clone: clone, + tap: tap, + get: get, + has: has, + mapObject: mapObject, + identity: identity, + constant: constant, + noop: noop, + toPath: toPath$1, + property: property, + propertyOf: propertyOf, + matcher: matcher, + matches: matcher, + times: times, + random: random, + now: now, + escape: _escape, + unescape: _unescape, + templateSettings: templateSettings, + template: template, + result: result, + uniqueId: uniqueId, + chain: chain, + iteratee: iteratee, + partial: partial, + bind: bind, + bindAll: bindAll, + memoize: memoize, + delay: delay, + defer: defer, + throttle: throttle, + debounce: debounce, + wrap: wrap, + negate: negate, + compose: compose, + after: after, + before: before, + once: once, + findKey: findKey, + findIndex: findIndex, + findLastIndex: findLastIndex, + sortedIndex: sortedIndex, + indexOf: indexOf, + lastIndexOf: lastIndexOf, + find: find, + detect: find, + findWhere: findWhere, + each: each, + forEach: each, + map: map, + collect: map, + reduce: reduce, + foldl: reduce, + inject: reduce, + reduceRight: reduceRight, + foldr: reduceRight, + filter: filter, + select: filter, + reject: reject, + every: every, + all: every, + some: some, + any: some, + contains: contains, + includes: contains, + include: contains, + invoke: invoke, + pluck: pluck, + where: where, + max: max, + min: min, + shuffle: shuffle, + sample: sample, + sortBy: sortBy, + groupBy: groupBy, + indexBy: indexBy, + countBy: countBy, + partition: partition, + toArray: toArray, + size: size, + pick: pick, + omit: omit, + first: first, + head: first, + take: first, + initial: initial, + last: last, + rest: rest, + tail: rest, + drop: rest, + compact: compact, + flatten: flatten, + without: without, + uniq: uniq, + unique: uniq, + union: union, + intersection: intersection, + difference: difference, + unzip: unzip, + transpose: unzip, + zip: zip, + object: object, + range: range, + chunk: chunk, + mixin: mixin, + 'default': _$1 + }; + + // Default Export + + // Add all of the Underscore functions to the wrapper object. + var _ = mixin(allExports); + // Legacy Node.js API. + _._ = _; + + return _; + +}))); +//# sourceMappingURL=underscore-umd.js.map diff --git a/docs/build/html/_static/underscore.js b/docs/build/html/_static/underscore.js index 5b55f32..cf177d4 100644 --- a/docs/build/html/_static/underscore.js +++ b/docs/build/html/_static/underscore.js @@ -1,31 +1,6 @@ -// Underscore.js 1.3.1 -// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore -(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== -c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, -h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= -b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a== -null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= -function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= -e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= -function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, -c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}}; -b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, -1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; -b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; -b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), -function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ -u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= -function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= -true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){ +// Underscore.js 1.13.1 +// https://underscorejs.org +// (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +var n="1.13.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e":">",'"':""","'":"'","`":"`"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o0?0:u-1;o>=0&&o0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ao&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);ir?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;ae||void 0===t)return 1;if(t - adobe package — pdfservices-sdk documentation - + adobe package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
    @@ -93,9 +95,9 @@
    -

    adobe package

    +

    adobe package

    -

    Subpackages

    +

    Subpackages

    diff --git a/docs/build/html/adobe.pdfservices.html b/docs/build/html/adobe.pdfservices.html index 9c5dba6..f6ab9bb 100644 --- a/docs/build/html/adobe.pdfservices.html +++ b/docs/build/html/adobe.pdfservices.html @@ -3,13 +3,15 @@ - adobe.pdfservices package — pdfservices-sdk documentation - + adobe.pdfservices package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,9 +95,9 @@
    -

    adobe.pdfservices package

    +

    adobe.pdfservices package

    -

    Subpackages

    +

    Subpackages

    diff --git a/docs/build/html/adobe.pdfservices.operation.auth.html b/docs/build/html/adobe.pdfservices.operation.auth.html index 5d13a8d..d7a8177 100644 --- a/docs/build/html/adobe.pdfservices.operation.auth.html +++ b/docs/build/html/adobe.pdfservices.operation.auth.html @@ -3,13 +3,15 @@ - adobe.pdfservices.operation.auth package — pdfservices-sdk documentation - + adobe.pdfservices.operation.auth package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,28 +95,28 @@
    -

    adobe.pdfservices.operation.auth package

    +

    adobe.pdfservices.operation.auth package

    -

    Submodules

    +

    Submodules

    -

    adobe.pdfservices.operation.auth.credentials module

    +

    adobe.pdfservices.operation.auth.credentials module

    -
    -class adobe.pdfservices.operation.auth.credentials.Credentials
    +
    +class adobe.pdfservices.operation.auth.credentials.Credentials

    Bases: abc.ABC

    Marker base class for different types of credentials. Currently it supports only ServiceAccountCredentials. The factory methods within this class can be used to create instances of credentials classes.

    -
    -static service_account_credentials_builder()
    +
    +static service_account_credentials_builder()

    Creates a new ServiceAccountCredentials builder.

    Returns

    An instance of ServiceAccountCredentials Builder.

    Return type
    -

    ServiceAccountCredentials.Builder

    +

    ServiceAccountCredentials.Builder

    @@ -123,22 +125,22 @@

    Submodules -

    adobe.pdfservices.operation.auth.service_account_credentials module

    +

    adobe.pdfservices.operation.auth.service_account_credentials module

    -
    -class adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials(client_id, client_secret, private_key, organization_id, account_id, ims_base_uri=adobe.pdfservices.operation.internal.service_constants.ServiceConstants.JWT_BASE_URI, claim=None)
    +
    +class adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials(client_id, client_secret, private_key, organization_id, account_id, ims_base_uri=adobe.pdfservices.operation.internal.constants.service_constants.ServiceConstants.JWT_BASE_URI, claim=None)

    Bases: adobe.pdfservices.operation.auth.credentials.Credentials, abc.ABC

    Service Account credentials allow your application to call PDF Tools Extract API on behalf of the application itself, or on behalf of an enterprise organization. For getting the credentials, Click Here.

    -
    -class Builder
    +
    +class Builder

    Bases: object

    Builds a ServiceAccountCredentials instance.

    -
    -build()
    +
    +build()

    Returns a new ServiceAccountCredentials instance built from the current state of this builder.

    Returns
    @@ -151,8 +153,8 @@

    Submodules -
    -from_file(credentials_file_path: str)
    +
    +from_file(credentials_file_path: str)

    Sets Service Account Credentials using the JSON credentials file path. All the keys in the JSON structure are optional.

    JSON structure:

    Return type
    -

    ServiceAccountCredentials.Builder

    +

    ServiceAccountCredentials.Builder

    -
    -with_account_id(account_id: str)
    +
    +with_account_id(account_id: str)

    Set Account Id (format: id@techacct.adobe.com)

    Parameters
    @@ -194,14 +196,14 @@

    Submodules

    This Builder instance to add any additional parameters.

    Return type
    -

    ServiceAccountCredentials.Builder

    +

    ServiceAccountCredentials.Builder

    -
    -with_client_id(client_id: str)
    +
    +with_client_id(client_id: str)

    Set Client ID (API Key)

    Parameters
    @@ -211,14 +213,14 @@

    Submodules

    This Builder instance to add any additional parameters.

    Return type
    -

    ServiceAccountCredentials.Builder

    +

    ServiceAccountCredentials.Builder

    -
    -with_client_secret(client_secret: str)
    +
    +with_client_secret(client_secret: str)

    Set Client Secret

    Parameters
    @@ -228,14 +230,14 @@

    Submodules

    This Builder instance to add any additional parameters.

    Return type
    -

    ServiceAccountCredentials.Builder

    +

    ServiceAccountCredentials.Builder

    -
    -with_organization_id(organization_id: str)
    +
    +with_organization_id(organization_id: str)

    Set Organization Id (format: org_ident@AdobeOrg) that has been configured for access to PDF Tools API

    Parameters
    @@ -245,14 +247,14 @@

    Submodules

    This Builder instance to add any additional parameters.

    Return type
    -

    ServiceAccountCredentials.Builder

    +

    ServiceAccountCredentials.Builder

  • Exceptions
  • -
    -with_private_key(private_key: str)
    +
    +with_private_key(private_key: str)

    Set private key

    Parameters
    @@ -262,46 +264,46 @@

    Submodules

    This Builder instance to add any additional parameters.

    Return type
    -

    ServiceAccountCredentials.Builder

    +

    ServiceAccountCredentials.Builder

    -
    -
    -property account_id
    +
    +
    +property account_id

    Account ID(format: id@techacct.adobe.com)

    -
    -
    -property claim
    +
    +
    +property claim

    Identifies the Service for which Authorization(Access) Token will be issued

    -
    -
    -property client_id
    +
    +
    +property client_id

    Client Id (API Key)

    -
    -
    -property client_secret
    +
    +
    +property client_secret

    Client Secret

    -
    -
    -property organization_id
    +
    +
    +property organization_id

    Identifies the organization(format: org_ident@AdobeOrg) that has been configured for access to PDF Tools API.

    -
    -
    -property private_key
    +
    +
    +property private_key

    Content of the Private Key (PEM format)

    @@ -309,7 +311,7 @@

    Submodules -

    Module contents

    +

    Module contents

    diff --git a/docs/build/html/adobe.pdfservices.operation.exception.html b/docs/build/html/adobe.pdfservices.operation.exception.html index 5318f97..9f51d26 100644 --- a/docs/build/html/adobe.pdfservices.operation.exception.html +++ b/docs/build/html/adobe.pdfservices.operation.exception.html @@ -3,13 +3,15 @@ - adobe.pdfservices.operation.exception package — pdfservices-sdk documentation - + adobe.pdfservices.operation.exception package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,94 +95,94 @@
    -

    adobe.pdfservices.operation.exception package

    +

    adobe.pdfservices.operation.exception package

    -

    Submodules

    +

    Submodules

    -

    adobe.pdfservices.operation.exception.exceptions module

    +

    adobe.pdfservices.operation.exception.exceptions module

    -
    -exception adobe.pdfservices.operation.exception.exceptions.SdkException(message, request_tracking_id=None)
    +
    +exception adobe.pdfservices.operation.exception.exceptions.SdkException(message, request_tracking_id=None)

    Bases: Exception

    SdkException is typically thrown for client-side or network errors.

    -
    -
    -property request_tracking_id
    +
    +
    +property request_tracking_id

    The request tracking id of the exception.

    -
    -exception adobe.pdfservices.operation.exception.exceptions.ServiceApiException(message, request_tracking_id, status_code=0, error_code='UNKNOWN')
    +
    +exception adobe.pdfservices.operation.exception.exceptions.ServiceApiException(message, request_tracking_id, status_code=0, error_code='UNKNOWN')

    Bases: Exception

    ServiceApiException is thrown when an underlying service API call results in an error.

    -
    -DEFAULT_ERROR_CODE = 'UNKNOWN'
    +
    +DEFAULT_ERROR_CODE = 'UNKNOWN'

    Returns the HTTP Status code or DEFAULT_STATUS_CODE if the status code doesn’t adequately represent the error.

    -
    -DEFAULT_STATUS_CODE = 0
    +
    +DEFAULT_STATUS_CODE = 0

    The default value of status code if there is no status code for this service exception.

    -
    -
    -property error_code
    +
    +
    +property error_code

    Returns the detailed message of this error.

    -
    -
    -property request_tracking_id
    +
    +
    +property request_tracking_id

    The request tracking id of the exception.

    -
    -
    -property status_code
    +
    +
    +property status_code

    Returns the HTTP Status code or DEFAULT_STATUS_CODE if the status code doesn’t adequately represent the error.

    -
    -exception adobe.pdfservices.operation.exception.exceptions.ServiceUsageException(message, request_tracking_id, status_code=429, error_code='UNKNOWN')
    +
    +exception adobe.pdfservices.operation.exception.exceptions.ServiceUsageException(message, request_tracking_id, status_code=429, error_code='UNKNOWN')

    Bases: Exception

    ServiceUsageError is thrown when either service usage limit has been reached or credentials quota has been exhausted.

    -
    -DEFAULT_ERROR_CODE = 'UNKNOWN'
    +
    +DEFAULT_ERROR_CODE = 'UNKNOWN'

    The default value of error code if there is no status code for this service failure.

    -
    -DEFAULT_STATUS_CODE = 429
    +
    +DEFAULT_STATUS_CODE = 429

    The default value of status code if there is no status code for this service failure.

    -
    -
    -property error_code
    +
    +
    +property error_code

    Returns the detailed message of this error.

    -
    -
    -property request_tracking_id
    +
    +
    +property request_tracking_id

    The request tracking id of the exception.

    -
    -
    -property status_code
    +
    +
    +property status_code

    Returns the HTTP Status code or DEFAULT_STATUS_CODE if the status code doesn’t adequately represent the error.

    @@ -188,7 +190,7 @@

    Submodules -

    Module contents

    +

    Module contents

    diff --git a/docs/build/html/adobe.pdfservices.operation.html b/docs/build/html/adobe.pdfservices.operation.html index 7fac2a2..86b4270 100644 --- a/docs/build/html/adobe.pdfservices.operation.html +++ b/docs/build/html/adobe.pdfservices.operation.html @@ -3,13 +3,15 @@ - adobe.pdfservices.operation package — pdfservices-sdk documentation - + adobe.pdfservices.operation package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,9 +95,9 @@
    -

    adobe.pdfservices.operation package

    +

    adobe.pdfservices.operation package

    -

    Subpackages

    +

    Subpackages

    -

    adobe.pdfservices.operation.client_config module

    +

    adobe.pdfservices.operation.client_config module

    -
    -class adobe.pdfservices.operation.client_config.ClientConfig
    +
    +class adobe.pdfservices.operation.client_config.ClientConfig

    Bases: object

    Encapsulates the API request configurations

    -
    -class Builder
    +
    +class Builder

    Bases: object

    Builds a ClientConfig instance.

    -
    -build()
    +
    +build()

    Returns a new ClientConfig instance built from the current state of this builder.

    Returns
    @@ -164,8 +166,8 @@

    Submodules -
    -from_file(client_config_file_path: str)
    +
    +from_file(client_config_file_path: str)

    Sets the connect timeout and read timeout using the JSON client config file path. All the keys in the JSON structure are optional.

    Parameters
    @@ -188,8 +190,8 @@

    Submodules -
    -with_connect_timeout(connect_timeout: int)
    +
    +with_connect_timeout(connect_timeout: int)

    Sets the connect timeout. It should be greater than zero.

    Parameters
    @@ -205,8 +207,25 @@

    Submodules -
    -with_read_timeout(read_timeout: int)
    +
    +with_pdf_services_uri(pdf_services_uri: str)
    +

    Sets the pdf services uri link.

    +
    +
    Parameters
    +

    pdf_services_uri (str) – url for the new rest api

    +
    +
    Returns
    +

    This Builder instance to add any additional parameters.

    +
    +
    Return type
    +

    ClientConfig.Builder

    +
    +
    +

    + +
    +
    +with_read_timeout(read_timeout: int)

    Sets the read timeout. It should be greater than zero.

    Parameters
    @@ -224,8 +243,8 @@

    Submodules -
    -static builder()
    +
    +static builder()

    Creates a new ClientConfig builder.

    Returns
    @@ -241,10 +260,10 @@

    Submodules -

    adobe.pdfservices.operation.execution_context module

    +

    adobe.pdfservices.operation.execution_context module

    -
    -class adobe.pdfservices.operation.execution_context.ExecutionContext
    +
    +class adobe.pdfservices.operation.execution_context.ExecutionContext

    Bases: object

    Represents the execution context of an Operation. An execution context typically consists of the desired authentication credentials and client configurations such as timeouts.

    @@ -278,8 +297,8 @@

    Submodules -
    -static create(credentials: adobe.pdfservices.operation.auth.credentials.Credentials, client_config: Optional[adobe.pdfservices.operation.client_config.ClientConfig] = None)
    +
    +static create(credentials: adobe.pdfservices.operation.auth.credentials.Credentials, client_config: Optional[adobe.pdfservices.operation.client_config.ClientConfig] = None)

    Creates a context instance using the provided Credentials and ClientConfig

    Parameters
    @@ -301,21 +320,21 @@

    Submodules -

    adobe.pdfservices.operation.operation module

    +

    adobe.pdfservices.operation.operation module

    -
    -class adobe.pdfservices.operation.operation.Operation
    +
    +class adobe.pdfservices.operation.operation.Operation

    Bases: abc.ABC

    -
    -abstract execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)
    +
    +abstract execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)

    -

    Module contents

    +

    Module contents

    diff --git a/docs/build/html/adobe.pdfservices.operation.io.html b/docs/build/html/adobe.pdfservices.operation.io.html index cfae53f..6236b40 100644 --- a/docs/build/html/adobe.pdfservices.operation.io.html +++ b/docs/build/html/adobe.pdfservices.operation.io.html @@ -3,13 +3,15 @@ - adobe.pdfservices.operation.io package — pdfservices-sdk documentation - + adobe.pdfservices.operation.io package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,22 +95,22 @@
    -

    adobe.pdfservices.operation.io package

    +

    adobe.pdfservices.operation.io package

    -

    Submodules

    +

    Submodules

    -

    adobe.pdfservices.operation.io.file_ref module

    +

    adobe.pdfservices.operation.io.file_ref module

    -
    -class adobe.pdfservices.operation.io.file_ref.FileRef
    +
    +class adobe.pdfservices.operation.io.file_ref.FileRef

    Bases: abc.ABC

    This class represents a local file. It is typically used by an SDK Operation which accepts or returns files.

    When a FileRef instance is created by this SDK while referring to a temporary file location, calling any of the methods to save the fileRef (For example, create_from_stream() etc.) will delete the temporary file.

    -
    -static create_from_local_file(local_source: str, media_type: Optional[str] = None)
    +
    +static create_from_local_file(local_source: str, media_type: Optional[str] = None)

    Creates a FileRef instance from a local file path. If no media type is provided, it will be inferred from the file extension.

    @@ -128,8 +130,8 @@

    Submodules -
    -static create_from_stream(input_stream: _io.BufferedReader, media_type: str)
    +
    +static create_from_stream(input_stream: _io.BufferedReader, media_type: str)

    Creates a FileRef instance from a readable stream using the specified media type. The stream is not read by this method but by consumers of file content i.e. the execute method of an operation such as execute().

    @@ -150,20 +152,26 @@

    Submodules -
    -abstract save_as(local_file_path: str)
    +
    +get_media_type()
    +

    returns the media type

    +

    + +
    +
    +abstract save_as(local_file_path: str)
    -
    -abstract write_to_stream(writer_stream)
    +
    +abstract write_to_stream(writer_stream)
    -

    Module contents

    +

    Module contents

    diff --git a/docs/build/html/adobe.pdfservices.operation.pdfops.html b/docs/build/html/adobe.pdfservices.operation.pdfops.html index b00208d..9fc2fd6 100644 --- a/docs/build/html/adobe.pdfservices.operation.pdfops.html +++ b/docs/build/html/adobe.pdfservices.operation.pdfops.html @@ -3,13 +3,15 @@ - adobe.pdfservices.operation.pdfops package — pdfservices-sdk documentation - + adobe.pdfservices.operation.pdfops package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,9 +95,9 @@
    -

    adobe.pdfservices.operation.pdfops package

    +

    adobe.pdfservices.operation.pdfops package

    -

    Subpackages

    +

    Subpackages

    -

    adobe.pdfservices.operation.pdfops.extract_pdf_operation module

    +

    adobe.pdfservices.operation.pdfops.extract_pdf_operation module

    -
    -class adobe.pdfservices.operation.pdfops.extract_pdf_operation.ExtractPDFOperation(create_key)
    +
    +class adobe.pdfservices.operation.pdfops.extract_pdf_operation.ExtractPDFOperation(create_key)

    Bases: adobe.pdfservices.operation.operation.Operation

    An Operation that extracts pdf elements such as text and tables in a structured format from a PDF, along with renditions for tables and figures.

    @@ -158,14 +160,14 @@

    Submodules -
    -SUPPORTED_SOURCE_MEDIA_TYPES = {adobe.pdfservices.operation.internal.extension_media_type_mapping.ExtensionMediaTypeMapping.PDF.mime_type}
    +
    +SUPPORTED_SOURCE_MEDIA_TYPES = {adobe.pdfservices.operation.internal.extension_media_type_mapping.ExtensionMediaTypeMapping.PDF.mime_type}

    Supported source file formats for ExtractPdfOperation is .pdf.

    -
    -classmethod create_new()
    +
    +classmethod create_new()

    creates a new instance of ExtractPDFOperation.

    Returns
    @@ -178,8 +180,8 @@

    Submodules -
    -execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)
    +
    +execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)

    Executes this operation synchronously using the supplied context and returns a new FileRef instance for the resulting Zip file. The resulting file may be stored in the system temporary directory. See adobe.pdfservices.operation.io.file_ref.FileRef for how temporary resources are cleaned up.

    @@ -199,8 +201,22 @@

    Submodules -
    -set_input(source_file_ref: adobe.pdfservices.operation.io.file_ref.FileRef)
    +
    +get_options()
    +

    gets the ExtractPDFOptions.

    +
    +
    Returns
    +

    The options parameter of the operation

    +
    +
    Return type
    +

    ExtractPDFOptions

    +
    +
    +

    + +
    +
    +set_input(source_file_ref: adobe.pdfservices.operation.io.file_ref.FileRef)

    Sets an input file.

    Parameters
    @@ -216,8 +232,8 @@

    Submodules -
    -set_options(extract_pdf_options: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions)
    +
    +set_options(extract_pdf_options: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions)

    sets the ExtractPDFOptions.

    Parameters
    @@ -236,7 +252,7 @@

    Submodules -

    Module contents

    +

    Module contents

    diff --git a/docs/build/html/adobe.pdfservices.operation.pdfops.options.extractpdf.html b/docs/build/html/adobe.pdfservices.operation.pdfops.options.extractpdf.html index a047d07..2265df3 100644 --- a/docs/build/html/adobe.pdfservices.operation.pdfops.options.extractpdf.html +++ b/docs/build/html/adobe.pdfservices.operation.pdfops.options.extractpdf.html @@ -3,13 +3,15 @@ - adobe.pdfservices.operation.pdfops.options.extractpdf package — pdfservices-sdk documentation - + adobe.pdfservices.operation.pdfops.options.extractpdf package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,15 +95,15 @@
    -

    adobe.pdfservices.operation.pdfops.options.extractpdf package

    +

    adobe.pdfservices.operation.pdfops.options.extractpdf package

    -

    Submodules

    +

    Submodules

    -

    adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options module

    +

    adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options module

    -
    -class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions(elements_to_extract, elements_to_extract_renditions, get_char_info, table_output_format, include_styling_info=None)
    +
    +class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions(elements_to_extract, elements_to_extract_renditions, get_char_info, table_output_format, include_styling_info=None)

    Bases: object

    An Options Class that defines the options for ExtractPDFOperation.

    extract_pdf_options: ExtractPDFOptions = ExtractPDFOptions.builder() \
    @@ -114,18 +116,18 @@ 

    Submodules -
    -class Builder
    +
    +class Builder

    Bases: object

    The builder for ExtractPDFOptions.

    -
    -build()
    +
    +build()
    -
    -with_element_to_extract(element_to_extract: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType)
    +
    +with_element_to_extract(element_to_extract: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType)

    adds a pdf element type for extracting structured information.

    Parameters
    @@ -144,8 +146,8 @@

    Submodules -
    -with_element_to_extract_renditions(element_to_extract_renditions: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType)
    +
    +with_element_to_extract_renditions(element_to_extract_renditions: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType)

    adds a pdf element type for extracting rendition.

    Parameters
    @@ -164,8 +166,8 @@

    Submodules -
    -with_elements_to_extract(elements_to_extract: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType])
    +
    +with_elements_to_extract(elements_to_extract: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType])

    adds a list of pdf element types for extracting structured information.

    Parameters
    @@ -184,8 +186,8 @@

    Submodules -
    -with_elements_to_extract_renditions(elements_to_extract_renditions: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType])
    +
    +with_elements_to_extract_renditions(elements_to_extract_renditions: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType])

    adds a list of pdf element types for extracting rendition.

    Parameters
    @@ -204,8 +206,8 @@

    Submodules -
    -with_get_char_info(get_char_info: bool)
    +
    +with_get_char_info(get_char_info: bool)

    sets the Boolean specifying whether to add character level bounding boxes to output json

    Parameters
    @@ -221,8 +223,8 @@

    Submodules -
    -with_include_styling_info(include_styling_info: bool)
    +
    +with_include_styling_info(include_styling_info: bool)

    sets the Boolean specifying whether to add PDF Elements Styling Info to output json

    Parameters
    @@ -238,8 +240,8 @@

    Submodules -
    -with_table_structure_format(table_structure: adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType)
    +
    +with_table_structure_format(table_structure: adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType)

    adds the table structure format (currently csv only) for extracting structured information.

    Parameters
    @@ -260,8 +262,8 @@

    Submodules -
    -static builder()
    +
    +static builder()

    Returns a Builder for ExtractPDFOptions

    Returns
    @@ -273,33 +275,33 @@

    Submodules -
    -property elements_to_extract
    +
    +
    +property elements_to_extract

    List of pdf element types to be extracted in a structured format from input file

    -
    -
    -property elements_to_extract_renditions
    +
    +
    +property elements_to_extract_renditions

    List of pdf element types whose renditions needs to be extracted from input file

    -
    -
    -property get_char_info
    +
    +
    +property get_char_info

    Boolean specifying whether to add character level bounding boxes to output json

    -
    -
    -property include_styling_info
    +
    +
    +property include_styling_info

    Boolean specifying whether to add PDF Elements Styling Info to output json

    -
    -
    -property table_output_format
    +
    +
    +property table_output_format

    export table in specified format - currently csv supported

    @@ -307,62 +309,62 @@

    Submodules -

    adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type module

    +

    adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type module

    -
    -class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType(value)
    +
    +class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType(value)

    Bases: str, enum.Enum

    enum of ElementTypes in a PDF which can be extracted as json.

    -
    -TABLES = 'tables'
    +
    +TABLES = 'tables'
    -
    -TEXT = 'text'
    +
    +TEXT = 'text'

    -

    adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type module

    +

    adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type module

    -
    -class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType(value)
    +
    +class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType(value)

    Bases: str, enum.Enum

    enum of ElementTypes in a PDF which can be extracted as renditions.

    -
    -FIGURES = 'figures'
    +
    +FIGURES = 'figures'
    -
    -TABLES = 'tables'
    +
    +TABLES = 'tables'
    -

    adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type module

    +

    adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type module

    -
    -class adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType(value)
    +
    +class adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType(value)

    Bases: str, enum.Enum

    enum of TableStructureType in a PDF.

    -
    -CSV = 'csv'
    +
    +CSV = 'csv'
    -

    Module contents

    +

    Module contents

    diff --git a/docs/build/html/adobe.pdfservices.operation.pdfops.options.html b/docs/build/html/adobe.pdfservices.operation.pdfops.options.html index 2f8d9e9..bbda18c 100644 --- a/docs/build/html/adobe.pdfservices.operation.pdfops.options.html +++ b/docs/build/html/adobe.pdfservices.operation.pdfops.options.html @@ -3,13 +3,15 @@ - adobe.pdfservices.operation.pdfops.options package — pdfservices-sdk documentation - + adobe.pdfservices.operation.pdfops.options package — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -93,9 +95,9 @@
    -

    adobe.pdfservices.operation.pdfops.options package

    +

    adobe.pdfservices.operation.pdfops.options package

    -

    Subpackages

    +

    Subpackages

    diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index aa10538..b58d14b 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -3,13 +3,15 @@ - Index — pdfservices-sdk documentation - + Index — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
  • Exceptions
  • @@ -116,7 +118,7 @@

    Index

    A

      -
    • account_id() (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1] +
    • account_id (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1]
    • adobe @@ -279,7 +281,7 @@

      A

      B

        -
      • Builder (class in adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials) +
      • Builder (class in adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials)
        • (class in adobe.pdfservices.operation.client_config.ClientConfig) @@ -311,11 +313,11 @@

          B

          C

            -
          • claim() (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1] +
          • claim (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1]
          • -
          • client_id() (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1] +
          • client_id (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1]
          • -
          • client_secret() (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1] +
          • client_secret (adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials property), [1]
          • ClientConfig (class in adobe.pdfservices.operation.client_config), [1]
          • @@ -365,11 +367,11 @@

            D

            E

            @@ -506,7 +516,7 @@

            O

            P

            @@ -514,7 +524,7 @@

            P

            R

              -
            • request_tracking_id() (adobe.pdfservices.operation.exception.exceptions.SdkException property), [1] +
            • request_tracking_id (adobe.pdfservices.operation.exception.exceptions.SdkException property), [1]
            • -
            • shift_headings() (adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions property) +
            • shift_headings (adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions property)
            • -
            • status_code() (adobe.pdfservices.operation.exception.exceptions.ServiceApiException property), [1] +
            • status_code (adobe.pdfservices.operation.exception.exceptions.ServiceApiException property), [1]
              • (adobe.pdfservices.operation.exception.exceptions.ServiceUsageException property), [1] @@ -576,7 +586,7 @@

                S

                T

                  -
                • table_output_format() (adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions property), [1] +
                • table_output_format (adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions property), [1]
                • TABLES (adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType attribute) @@ -596,11 +606,11 @@

                  T

                  W

                  - +
                • Exceptions
                • @@ -94,7 +96,7 @@
                  -

                  pdfservices-sdk

                  +

                  pdfservices-sdk

                  This is the documentation of all the exposed classes and modules in the SDK. Please click on any Operation Class in the API Reference section on left nav to get started.

                  diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html index 304b4e2..cf0db3a 100644 --- a/docs/build/html/modules.html +++ b/docs/build/html/modules.html @@ -3,13 +3,15 @@ - src — pdfservices-sdk documentation - + src — pdfservices-sdk documentation + + - + + @@ -62,7 +64,7 @@
                • Exceptions
                • @@ -93,7 +95,7 @@
                  -

                  src

                  +

                  src

                  • adobe package
                      diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv index 162008dc38bfb4e13c7152329e02399bad213450..e89c045ed6a214470df58223274c536de1655c82 100644 GIT binary patch delta 1411 zcmV-}1$_Fn3-Jq(e}7qXqc{+L&#$0r=QV6Rv*)~d9I} zo64%r)!qo&{E{pFT?*L!O*;uQv4ZP1fZgBqbJky_IPrUBS8QTw>jPeiIkSPPk$Xji{AFJyB$%ig8fTJ*c6ak zXUxAg$L%aLfj0-jTIp%lqn2Cey|Slr)>Fy8g>ZA_K3m1Xd6(gaFz^cu`ZVzq3jG=R3Ge`Be!`%0LkA~H zk^-@yb9m!g!sjy-(>j*Sa@ba3^mT~%XRAm$+D9jtC@Tq*T6z-Aw*81J{mVqCoJ_278G?SDPE7}@*~Y8neeFCv>}dW64HEcC=l zXIj#`kCZ>ni#SJHy$aJnemakoKW=LvQA$Gf{S?`}ma5V&DB^@8FG)D_%Bd_}+&@(6 zvC)^W3uvx3i^Y7ow(jlKe6yTc_BZSPacZx>FRWE3@k4D!>9i5RYkNni4PIqu{UFD) z7=J0`y8WUvfsTVvt8_U7s8j5K(WW$%^f-FtdH?5;;nD*g|ucWdI~$FAuNCrVEyJ6TN1L5xO`K5<&BG;c&P4e z^hGE6FYiGR%Z&r{kWfA{c5H{Y+};6laev^k;mLKjwa}JG#b;~#52h`p^KaELqjcUC zrA;TlTtb_9ups5Q6o3!=csnXf$j3_VxJ+5HY@PB|$z`w5)y~sgPrrOU58cL1+4^Ta zD#8U99-W;Qrl=n0AiG;pz&5WO3&Y=89H zWd93w##yMdLsTS#TQV|kIB@*P1)K4MpKRxik0M7;eoT-?4v#39FZiE+TDiT9JJGqo^Qg*YRz1e-rwMuU z;qkA{a%4GCqk)Vlw>w?wMrG<%w`5#9X{7*~9AH+i#^bD>26{g%1UH)5)P*6rVi4coORl%b%e~HHguQv=3b#`S$ RStc8^f@tZhv&qLN7B z{`v}pZE%Q@0AczDD`~$^%dWJN5Dw@QIPw1Tjs{5x&Ygo(3EGNX_??p7e(&7gC}|w5 zIj|Sv1FvXPD6MagXbcPsLZcc@$9g6@5l+NbTX9<1SUd6=1b+|-f34n36yz3y$_J!7yDe+jPATO2|tmS(WobGF(WTnfcFf0Enc7O@iOssivy$_ z70K?(479_`J`3G=vdF|Zek^h^ikCVbxru!mt;xnp5?ew*lk9DBglm<9e5~3a$GB?^ zqMt*I+G82z2%p;Hsfmq75%|IrWCt|Sn%aKs2$}&7On-2HYL464f&kuph>cc-#}-DR zb!v5dDlaxF*|$)R7QwSy?A)oRZB6wN3S#h20$lnY!~QdgHk}N=)v)=H81LuxmsL-05C?GjLiW0`^49EFvJBG3GboL zD~>nNpMPVQ;jZD@A28_Cxz8x{<=$toy*v0Be#b5jev+l(ataslCaff_?@*9?kW5an zt&-Pzh;&y|Ci?AdMyR%t2sN^kte)ngGD}mMqp z>PDu@o8UxHfj6Ff^-hIjC7s>}uz z;%jeb_rybY$Ga~&*-r5WqEv61q{ftqfwALTvKHPJa3ELU{QBfN+w5*jWN@F&@|ViT zTq$ij@SQZY83PMi4$}aHuuBg|#6E^WlYcu*QLd6LbG|xjxf;6Gd7|a`%h&gb)37PK ze=P?^xDddD^V8zsQp}{RBoe0hwi1b^JS-&=jp<}l^)Vc%m$x1~K{Va|;~%T}z*a(y zIx?UY-TC}BC|9o{hnA^uagYtdt2KF|$>L8NAKl?1_#9B*xg8bmF{(!=#{M(jK*d$Y zcdgEEGCCF4A3xGoIE%liw|sQ%Tz|YES&yYIJZb_SFUvXgS12{0Pd~$H;+KEfbu|A6 z)?h-YE`|J08mI2x9}Up_rvgpj!a1j-^Q(e3f#aEw8Ij_VkYjT4WK68MecO!VS=>7f zw~lk>8;G)WDI*i&CkRtI2dP4MOdoGf)pE{-8U^%Q9z5U3p}s - Python Module Index — pdfservices-sdk documentation - + Python Module Index — pdfservices-sdk documentation + + - + + @@ -65,7 +67,7 @@
                  • Exceptions
                  diff --git a/docs/build/html/reference/index.html b/docs/build/html/reference/index.html index c968ea1..059057f 100644 --- a/docs/build/html/reference/index.html +++ b/docs/build/html/reference/index.html @@ -3,13 +3,15 @@ - Overview — pdfservices-sdk documentation - + Overview — pdfservices-sdk documentation + + - + + @@ -63,7 +65,7 @@
                • Exceptions
                • @@ -94,16 +96,16 @@
                  -

                  Overview

                  +

                  Overview

                  -

                  Extract PDF

                  +

                  Extract PDF

                  -

                  ExtractPDFOperation

                  +

                  ExtractPDFOperation

                  -
                  -class adobe.pdfservices.operation.pdfops.extract_pdf_operation.ExtractPDFOperation(create_key)
                  +
                  +class adobe.pdfservices.operation.pdfops.extract_pdf_operation.ExtractPDFOperation(create_key)

                  Bases: adobe.pdfservices.operation.operation.Operation

                  An Operation that extracts pdf elements such as text and tables in a structured format from a PDF, along with renditions for tables and figures.

                  @@ -137,14 +139,14 @@

                  ExtractPDFOperation -
                  -SUPPORTED_SOURCE_MEDIA_TYPES = {adobe.pdfservices.operation.internal.extension_media_type_mapping.ExtensionMediaTypeMapping.PDF.mime_type}
                  +
                  +SUPPORTED_SOURCE_MEDIA_TYPES = {adobe.pdfservices.operation.internal.extension_media_type_mapping.ExtensionMediaTypeMapping.PDF.mime_type}

                  Supported source file formats for ExtractPdfOperation is .pdf.

                  -
                  -classmethod create_new()
                  +
                  +classmethod create_new()

                  creates a new instance of ExtractPDFOperation.

                  Returns
                  @@ -157,8 +159,8 @@

                  ExtractPDFOperation -
                  -execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)
                  +
                  +execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)

                  Executes this operation synchronously using the supplied context and returns a new FileRef instance for the resulting Zip file. The resulting file may be stored in the system temporary directory. See adobe.pdfservices.operation.io.file_ref.FileRef for how temporary resources are cleaned up.

                  @@ -178,8 +180,22 @@

                  ExtractPDFOperation -
                  -set_input(source_file_ref: adobe.pdfservices.operation.io.file_ref.FileRef)
                  +
                  +get_options()
                  +

                  gets the ExtractPDFOptions.

                  +
                  +
                  Returns
                  +

                  The options parameter of the operation

                  +
                  +
                  Return type
                  +

                  ExtractPDFOptions

                  +
                  +
                  +

                  + +
                  +
                  +set_input(source_file_ref: adobe.pdfservices.operation.io.file_ref.FileRef)

                  Sets an input file.

                  Parameters
                  @@ -195,8 +211,8 @@

                  ExtractPDFOperation -
                  -set_options(extract_pdf_options: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions)
                  +
                  +set_options(extract_pdf_options: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions)

                  sets the ExtractPDFOptions.

                  Parameters
                  @@ -215,10 +231,10 @@

                  ExtractPDFOperation -

                  ExtractPDFOptions

                  +

                  ExtractPDFOptions

                  -
                  -class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions(elements_to_extract, elements_to_extract_renditions, get_char_info, table_output_format, include_styling_info=None)
                  +
                  +class adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions(elements_to_extract, elements_to_extract_renditions, get_char_info, table_output_format, include_styling_info=None)

                  Bases: object

                  An Options Class that defines the options for ExtractPDFOperation.

                  extract_pdf_options: ExtractPDFOptions = ExtractPDFOptions.builder() \
                  @@ -231,18 +247,18 @@ 

                  ExtractPDFOptions -
                  -class Builder
                  +
                  +class Builder

                  Bases: object

                  The builder for ExtractPDFOptions.

                  -
                  -build()
                  +
                  +build()
                  -
                  -with_element_to_extract(element_to_extract: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType)
                  +
                  +with_element_to_extract(element_to_extract: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType)

                  adds a pdf element type for extracting structured information.

                  Parameters
                  @@ -261,8 +277,8 @@

                  ExtractPDFOptions -
                  -with_element_to_extract_renditions(element_to_extract_renditions: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType)
                  +
                  +with_element_to_extract_renditions(element_to_extract_renditions: adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType)

                  adds a pdf element type for extracting rendition.

                  Parameters
                  @@ -281,8 +297,8 @@

                  ExtractPDFOptions -
                  -with_elements_to_extract(elements_to_extract: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType])
                  +
                  +with_elements_to_extract(elements_to_extract: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType])

                  adds a list of pdf element types for extracting structured information.

                  Parameters
                  @@ -301,8 +317,8 @@

                  ExtractPDFOptions -
                  -with_elements_to_extract_renditions(elements_to_extract_renditions: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType])
                  +
                  +with_elements_to_extract_renditions(elements_to_extract_renditions: List[adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType])

                  adds a list of pdf element types for extracting rendition.

                  Parameters
                  @@ -321,8 +337,8 @@

                  ExtractPDFOptions -
                  -with_get_char_info(get_char_info: bool)
                  +
                  +with_get_char_info(get_char_info: bool)

                  sets the Boolean specifying whether to add character level bounding boxes to output json

                  Parameters
                  @@ -338,8 +354,8 @@

                  ExtractPDFOptions -
                  -with_include_styling_info(include_styling_info: bool)
                  +
                  +with_include_styling_info(include_styling_info: bool)

                  sets the Boolean specifying whether to add PDF Elements Styling Info to output json

                  Parameters
                  @@ -355,8 +371,8 @@

                  ExtractPDFOptions -
                  -with_table_structure_format(table_structure: adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType)
                  +
                  +with_table_structure_format(table_structure: adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType)

                  adds the table structure format (currently csv only) for extracting structured information.

                  Parameters
                  @@ -377,8 +393,8 @@

                  ExtractPDFOptions -
                  -static builder()
                  +
                  +static builder()

                  Returns a Builder for ExtractPDFOptions

                  Returns
                  @@ -390,33 +406,33 @@

                  ExtractPDFOptions -
                  -property elements_to_extract
                  +
                  +
                  +property elements_to_extract

                  List of pdf element types to be extracted in a structured format from input file

                  -
                  -
                  -property elements_to_extract_renditions
                  +
                  +
                  +property elements_to_extract_renditions

                  List of pdf element types whose renditions needs to be extracted from input file

                  -
                  -
                  -property get_char_info
                  +
                  +
                  +property get_char_info

                  Boolean specifying whether to add character level bounding boxes to output json

                  -
                  -
                  -property include_styling_info
                  +
                  +
                  +property include_styling_info

                  Boolean specifying whether to add PDF Elements Styling Info to output json

                  -
                  -
                  -property table_output_format
                  +
                  +
                  +property table_output_format

                  export table in specified format - currently csv supported

                  @@ -425,12 +441,12 @@

                  ExtractPDFOptions -

                  Autotag PDF

                  +

                  Autotag PDF

                  -

                  AutotagPDFOperation

                  +

                  AutotagPDFOperation

                  -
                  -class adobe.pdfservices.operation.pdfops.autotag_pdf_operation.AutotagPDFOperation(create_key)
                  +
                  +class adobe.pdfservices.operation.pdfops.autotag_pdf_operation.AutotagPDFOperation(create_key)

                  Bases: adobe.pdfservices.operation.operation.Operation

                  An operation that enables clients to improve accessibility of the PDF document. It generates the tagged PDF, along with an optional XLSX report providing detailed information about the added tags. The operation replaces any @@ -474,14 +490,14 @@

                  AutotagPDFOperation -
                  -SUPPORTED_SOURCE_MEDIA_TYPES = {adobe.pdfservices.operation.internal.extension_media_type_mapping.ExtensionMediaTypeMapping.PDF.mime_type}
                  +
                  +SUPPORTED_SOURCE_MEDIA_TYPES = {adobe.pdfservices.operation.internal.extension_media_type_mapping.ExtensionMediaTypeMapping.PDF.mime_type}

                  Supported source file formats for AutotagPdfOperation is .pdf.

                  -
                  -classmethod create_new()
                  +
                  +classmethod create_new()

                  creates a new instance of AutotagPDFOperation.

                  Returns
                  @@ -494,8 +510,8 @@

                  AutotagPDFOperation -
                  -execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)
                  +
                  +execute(execution_context: adobe.pdfservices.operation.execution_context.ExecutionContext)

                  Executes this operation synchronously using the supplied context and returns a new AutotagPDFOutputFiles instance for the generated tagged pdf file and XLSX report file. The resulting file may be stored in the system temporary directory. @@ -517,8 +533,22 @@

                  AutotagPDFOperation -
                  -set_input(source_file_ref: adobe.pdfservices.operation.io.file_ref.FileRef)
                  +
                  +get_options()
                  +

                  gets the AutotagPDFOptions.

                  +
                  +
                  Returns
                  +

                  The options parameter of the operation

                  +
                  +
                  Return type
                  +

                  AutotagPDFOptions

                  +
                  +
                  +

                  + +
                  +
                  +set_input(source_file_ref: adobe.pdfservices.operation.io.file_ref.FileRef)

                  Sets an input file.

                  Parameters
                  @@ -534,8 +564,8 @@

                  AutotagPDFOperation -
                  -set_options(autotag_pdf_options: adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions)
                  +
                  +set_options(autotag_pdf_options: adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions)

                  sets the AutotagPDFOptions.

                  Parameters
                  @@ -554,10 +584,10 @@

                  AutotagPDFOperation -

                  AutotagPDFOptions

                  +

                  AutotagPDFOptions

                  -
                  -class adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions(generate_report, shift_headings)
                  +
                  +class adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions(generate_report, shift_headings)

                  Bases: object

                  An Options Class that defines the options for AutotagPDFOperation.

                  autotag_pdf_options: AutotagPDFOptions = AutotagPDFOptions.builder() \
                  @@ -567,19 +597,19 @@ 

                  AutotagPDFOptions -
                  -class Builder
                  +
                  +class Builder

                  Bases: object

                  The builder for AutotagPDFOptions.

                  -
                  -build()
                  +
                  +build()

                  builds and returns the AutotagPDFOptions instance

                  -
                  -with_generate_report()
                  +
                  +with_generate_report()

                  sets the Boolean specifying whether to generate an XLSX report containing the information about the tags

                  Returns
                  @@ -592,8 +622,8 @@

                  AutotagPDFOptions -
                  -with_shift_headings()
                  +
                  +with_shift_headings()

                  sets the Boolean specifying whether to shift headings in the output PDF file

                  Returns
                  @@ -608,8 +638,8 @@

                  AutotagPDFOptions -
                  -static builder()
                  +
                  +static builder()

                  Returns a Builder for AutotagPDFOptions

                  Returns
                  @@ -621,15 +651,15 @@

                  AutotagPDFOptions -
                  -property generate_report
                  +
                  +
                  +property generate_report

                  Boolean specifying whether to generate an XLSX report as an output

                  -
                  -
                  -property shift_headings
                  +
                  +
                  +property shift_headings

                  Boolean specifying whether to shift the headings in the output PDF file

                  @@ -638,22 +668,22 @@

                  AutotagPDFOptions -

                  Config

                  +

                  Config

                  -

                  ClientConfig

                  +

                  ClientConfig

                  -
                  -class adobe.pdfservices.operation.client_config.ClientConfig
                  +
                  +class adobe.pdfservices.operation.client_config.ClientConfig

                  Bases: object

                  Encapsulates the API request configurations

                  -
                  -class Builder
                  +
                  +class Builder

                  Bases: object

                  Builds a ClientConfig instance.

                  -
                  -build()
                  +
                  +build()

                  Returns a new ClientConfig instance built from the current state of this builder.

                  Returns
                  @@ -666,8 +696,8 @@

                  ClientConfig -
                  -from_file(client_config_file_path: str)
                  +
                  +from_file(client_config_file_path: str)

                  Sets the connect timeout and read timeout using the JSON client config file path. All the keys in the JSON structure are optional.

                  Parameters
                  @@ -690,8 +720,8 @@

                  ClientConfig -
                  -with_connect_timeout(connect_timeout: int)
                  +
                  +with_connect_timeout(connect_timeout: int)

                  Sets the connect timeout. It should be greater than zero.

                  Parameters
                  @@ -707,8 +737,25 @@

                  ClientConfig -
                  -with_read_timeout(read_timeout: int)
                  +
                  +with_pdf_services_uri(pdf_services_uri: str)
                  +

                  Sets the pdf services uri link.

                  +
                  +
                  Parameters
                  +

                  pdf_services_uri (str) – url for the new rest api

                  +
                  +
                  Returns
                  +

                  This Builder instance to add any additional parameters.

                  +
                  +
                  Return type
                  +

                  ClientConfig.Builder

                  +
                  +
                  +

                  + +
                  +
                  +with_read_timeout(read_timeout: int)

                  Sets the read timeout. It should be greater than zero.

                  Parameters
                  @@ -726,8 +773,8 @@

                  ClientConfig -
                  -static builder()
                  +
                  +static builder()

                  Creates a new ClientConfig builder.

                  Returns
                  @@ -743,15 +790,15 @@

                  ClientConfig -

                  ClientConfigBuilder

                  +

                  ClientConfigBuilder

                  -
                  -class adobe.pdfservices.operation.client_config.ClientConfig.Builder
                  +
                  +class adobe.pdfservices.operation.client_config.ClientConfig.Builder

                  Bases: object

                  Builds a ClientConfig instance.

                  -
                  -build()
                  +
                  +build()

                  Returns a new ClientConfig instance built from the current state of this builder.

                  Returns
                  @@ -764,8 +811,8 @@

                  ClientConfigBuilder -
                  -from_file(client_config_file_path: str)
                  +
                  +from_file(client_config_file_path: str)

                  Sets the connect timeout and read timeout using the JSON client config file path. All the keys in the JSON structure are optional.

                  Parameters
                  @@ -788,8 +835,8 @@

                  ClientConfigBuilder -
                  -with_connect_timeout(connect_timeout: int)
                  +
                  +with_connect_timeout(connect_timeout: int)

                  Sets the connect timeout. It should be greater than zero.

                  Parameters
                  @@ -805,8 +852,25 @@

                  ClientConfigBuilder -
                  -with_read_timeout(read_timeout: int)
                  +
                  +with_pdf_services_uri(pdf_services_uri: str)
                  +

                  Sets the pdf services uri link.

                  +
                  +
                  Parameters
                  +

                  pdf_services_uri (str) – url for the new rest api

                  +
                  +
                  Returns
                  +

                  This Builder instance to add any additional parameters.

                  +
                  +
                  Return type
                  +

                  ClientConfig.Builder

                  +
                  +
                  +

                  + +
                  +
                  +with_read_timeout(read_timeout: int)

                  Sets the read timeout. It should be greater than zero.

                  Parameters
                  @@ -825,10 +889,10 @@

                  ClientConfigBuilder -

                  ExecutionContext

                  +

                  ExecutionContext

                  -
                  -class adobe.pdfservices.operation.execution_context.ExecutionContext
                  +
                  +class adobe.pdfservices.operation.execution_context.ExecutionContext

                  Bases: object

                  Represents the execution context of an Operation. An execution context typically consists of the desired authentication credentials and client configurations such as timeouts.

                  @@ -862,8 +926,8 @@

                  ExecutionContext -
                  -static create(credentials: adobe.pdfservices.operation.auth.credentials.Credentials, client_config: Optional[adobe.pdfservices.operation.client_config.ClientConfig] = None)
                  +
                  +static create(credentials: adobe.pdfservices.operation.auth.credentials.Credentials, client_config: Optional[adobe.pdfservices.operation.client_config.ClientConfig] = None)

                  Creates a context instance using the provided Credentials and ClientConfig

                  Parameters
                  @@ -886,25 +950,25 @@

                  ExecutionContext -

                  Auth

                  +

                  Auth

                  -

                  Credentials

                  +

                  Credentials

                  -
                  -class adobe.pdfservices.operation.auth.credentials.Credentials
                  +
                  +class adobe.pdfservices.operation.auth.credentials.Credentials

                  Bases: abc.ABC

                  Marker base class for different types of credentials. Currently it supports only ServiceAccountCredentials. The factory methods within this class can be used to create instances of credentials classes.

                  -
                  -static service_account_credentials_builder()
                  +
                  +static service_account_credentials_builder()

                  Creates a new ServiceAccountCredentials builder.

                  Returns

                  An instance of ServiceAccountCredentials Builder.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  @@ -913,22 +977,22 @@

                  Credentials -

                  ServiceAccountCredentials

                  +

                  ServiceAccountCredentials

                  -
                  -class adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials(client_id, client_secret, private_key, organization_id, account_id, ims_base_uri=adobe.pdfservices.operation.internal.service_constants.ServiceConstants.JWT_BASE_URI, claim=None)
                  +
                  +class adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials(client_id, client_secret, private_key, organization_id, account_id, ims_base_uri=adobe.pdfservices.operation.internal.constants.service_constants.ServiceConstants.JWT_BASE_URI, claim=None)

                  Bases: adobe.pdfservices.operation.auth.credentials.Credentials, abc.ABC

                  Service Account credentials allow your application to call PDF Tools Extract API on behalf of the application itself, or on behalf of an enterprise organization. For getting the credentials, Click Here.

                  -
                  -class Builder
                  +
                  +class Builder

                  Bases: object

                  Builds a ServiceAccountCredentials instance.

                  -
                  -build()
                  +
                  +build()

                  Returns a new ServiceAccountCredentials instance built from the current state of this builder.

                  Returns
                  @@ -941,8 +1005,8 @@

                  ServiceAccountCredentials -
                  -from_file(credentials_file_path: str)
                  +
                  +from_file(credentials_file_path: str)

                  Sets Service Account Credentials using the JSON credentials file path. All the keys in the JSON structure are optional.

                  JSON structure:

                  {
                  @@ -967,14 +1031,14 @@ 

                  ServiceAccountCredentials

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_account_id(account_id: str)
                  +
                  +with_account_id(account_id: str)

                  Set Account Id (format: id@techacct.adobe.com)

                  Parameters
                  @@ -984,14 +1048,14 @@

                  ServiceAccountCredentials

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_client_id(client_id: str)
                  +
                  +with_client_id(client_id: str)

                  Set Client ID (API Key)

                  Parameters
                  @@ -1001,14 +1065,14 @@

                  ServiceAccountCredentials

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_client_secret(client_secret: str)
                  +
                  +with_client_secret(client_secret: str)

                  Set Client Secret

                  Parameters
                  @@ -1018,14 +1082,14 @@

                  ServiceAccountCredentials

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_organization_id(organization_id: str)
                  +
                  +with_organization_id(organization_id: str)

                  Set Organization Id (format: org_ident@AdobeOrg) that has been configured for access to PDF Tools API

                  Parameters
                  @@ -1035,14 +1099,14 @@

                  ServiceAccountCredentials

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_private_key(private_key: str)
                  +
                  +with_private_key(private_key: str)

                  Set private key

                  Parameters
                  @@ -1052,46 +1116,46 @@

                  ServiceAccountCredentials

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -
                  -property account_id
                  +
                  +
                  +property account_id

                  Account ID(format: id@techacct.adobe.com)

                  -
                  -
                  -property claim
                  +
                  +
                  +property claim

                  Identifies the Service for which Authorization(Access) Token will be issued

                  -
                  -
                  -property client_id
                  +
                  +
                  +property client_id

                  Client Id (API Key)

                  -
                  -
                  -property client_secret
                  +
                  +
                  +property client_secret

                  Client Secret

                  -
                  -
                  -property organization_id
                  +
                  +
                  +property organization_id

                  Identifies the organization(format: org_ident@AdobeOrg) that has been configured for access to PDF Tools API.

                  -
                  -
                  -property private_key
                  +
                  +
                  +property private_key

                  Content of the Private Key (PEM format)

                  @@ -1099,15 +1163,15 @@

                  ServiceAccountCredentials -

                  ServiceAccountCredentialsBuilder

                  +

                  ServiceAccountCredentialsBuilder

                  -
                  -class adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials.Builder
                  +
                  +class adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials.Builder

                  Bases: object

                  Builds a ServiceAccountCredentials instance.

                  -
                  -build()
                  +
                  +build()

                  Returns a new ServiceAccountCredentials instance built from the current state of this builder.

                  Returns
                  @@ -1120,8 +1184,8 @@

                  ServiceAccountCredentialsBuilder -
                  -from_file(credentials_file_path: str)
                  +
                  +from_file(credentials_file_path: str)

                  Sets Service Account Credentials using the JSON credentials file path. All the keys in the JSON structure are optional.

                  JSON structure:

                  {
                  @@ -1146,14 +1210,14 @@ 

                  ServiceAccountCredentialsBuilder

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_account_id(account_id: str)
                  +
                  +with_account_id(account_id: str)

                  Set Account Id (format: id@techacct.adobe.com)

                  Parameters
                  @@ -1163,14 +1227,14 @@

                  ServiceAccountCredentialsBuilder

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_client_id(client_id: str)
                  +
                  +with_client_id(client_id: str)

                  Set Client ID (API Key)

                  Parameters
                  @@ -1180,14 +1244,14 @@

                  ServiceAccountCredentialsBuilder

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_client_secret(client_secret: str)
                  +
                  +with_client_secret(client_secret: str)

                  Set Client Secret

                  Parameters
                  @@ -1197,14 +1261,14 @@

                  ServiceAccountCredentialsBuilder

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_organization_id(organization_id: str)
                  +
                  +with_organization_id(organization_id: str)

                  Set Organization Id (format: org_ident@AdobeOrg) that has been configured for access to PDF Tools API

                  Parameters
                  @@ -1214,14 +1278,14 @@

                  ServiceAccountCredentialsBuilder

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  -
                  -with_private_key(private_key: str)
                  +
                  +with_private_key(private_key: str)

                  Set private key

                  Parameters
                  @@ -1231,7 +1295,7 @@

                  ServiceAccountCredentialsBuilder

                  This Builder instance to add any additional parameters.

                  Return type
                  -

                  ServiceAccountCredentials.Builder

                  +

                  ServiceAccountCredentials.Builder

                  @@ -1241,19 +1305,19 @@

                  ServiceAccountCredentialsBuilder -

                  IO

                  +

                  IO

                  -

                  FileRef

                  +

                  FileRef

                  -
                  -class adobe.pdfservices.operation.io.file_ref.FileRef
                  +
                  +class adobe.pdfservices.operation.io.file_ref.FileRef

                  Bases: abc.ABC

                  This class represents a local file. It is typically used by an SDK Operation which accepts or returns files.

                  When a FileRef instance is created by this SDK while referring to a temporary file location, calling any of the methods to save the fileRef (For example, create_from_stream() etc.) will delete the temporary file.

                  -
                  -static create_from_local_file(local_source: str, media_type: Optional[str] = None)
                  +
                  +static create_from_local_file(local_source: str, media_type: Optional[str] = None)

                  Creates a FileRef instance from a local file path. If no media type is provided, it will be inferred from the file extension.

                  @@ -1273,8 +1337,8 @@

                  FileRef -
                  -static create_from_stream(input_stream: _io.BufferedReader, media_type: str)
                  +
                  +static create_from_stream(input_stream: _io.BufferedReader, media_type: str)

                  Creates a FileRef instance from a readable stream using the specified media type. The stream is not read by this method but by consumers of file content i.e. the execute method of an operation such as execute().

                  @@ -1295,13 +1359,19 @@

                  FileRef -
                  -abstract save_as(local_file_path: str)
                  +
                  +get_media_type()
                  +

                  returns the media type

                  +

                  + +
                  +
                  +abstract save_as(local_file_path: str)
                  -
                  -abstract write_to_stream(writer_stream)
                  +
                  +abstract write_to_stream(writer_stream)
                  @@ -1309,91 +1379,91 @@

                  FileRef -

                  Exceptions

                  -
                  -

                  Exceptions

                  +

                  Exceptions

                  +
                  +

                  Exceptions

                  -
                  -exception adobe.pdfservices.operation.exception.exceptions.SdkException(message, request_tracking_id=None)
                  +
                  +exception adobe.pdfservices.operation.exception.exceptions.SdkException(message, request_tracking_id=None)

                  Bases: Exception

                  SdkException is typically thrown for client-side or network errors.

                  -
                  -
                  -property request_tracking_id
                  +
                  +
                  +property request_tracking_id

                  The request tracking id of the exception.

                  -
                  -exception adobe.pdfservices.operation.exception.exceptions.ServiceApiException(message, request_tracking_id, status_code=0, error_code='UNKNOWN')
                  +
                  +exception adobe.pdfservices.operation.exception.exceptions.ServiceApiException(message, request_tracking_id, status_code=0, error_code='UNKNOWN')

                  Bases: Exception

                  ServiceApiException is thrown when an underlying service API call results in an error.

                  -
                  -DEFAULT_ERROR_CODE = 'UNKNOWN'
                  +
                  +DEFAULT_ERROR_CODE = 'UNKNOWN'

                  Returns the HTTP Status code or DEFAULT_STATUS_CODE if the status code doesn’t adequately represent the error.

                  -
                  -DEFAULT_STATUS_CODE = 0
                  +
                  +DEFAULT_STATUS_CODE = 0

                  The default value of status code if there is no status code for this service exception.

                  -
                  -
                  -property error_code
                  +
                  +
                  +property error_code

                  Returns the detailed message of this error.

                  -
                  -
                  -property request_tracking_id
                  +
                  +
                  +property request_tracking_id

                  The request tracking id of the exception.

                  -
                  -
                  -property status_code
                  +
                  +
                  +property status_code

                  Returns the HTTP Status code or DEFAULT_STATUS_CODE if the status code doesn’t adequately represent the error.

                  -
                  -exception adobe.pdfservices.operation.exception.exceptions.ServiceUsageException(message, request_tracking_id, status_code=429, error_code='UNKNOWN')
                  +
                  +exception adobe.pdfservices.operation.exception.exceptions.ServiceUsageException(message, request_tracking_id, status_code=429, error_code='UNKNOWN')

                  Bases: Exception

                  ServiceUsageError is thrown when either service usage limit has been reached or credentials quota has been exhausted.

                  -
                  -DEFAULT_ERROR_CODE = 'UNKNOWN'
                  +
                  +DEFAULT_ERROR_CODE = 'UNKNOWN'

                  The default value of error code if there is no status code for this service failure.

                  -
                  -DEFAULT_STATUS_CODE = 429
                  +
                  +DEFAULT_STATUS_CODE = 429

                  The default value of status code if there is no status code for this service failure.

                  -
                  -
                  -property error_code
                  +
                  +
                  +property error_code

                  Returns the detailed message of this error.

                  -
                  -
                  -property request_tracking_id
                  +
                  +
                  +property request_tracking_id

                  The request tracking id of the exception.

                  -
                  -
                  -property status_code
                  +
                  +
                  +property status_code

                  Returns the HTTP Status code or DEFAULT_STATUS_CODE if the status code doesn’t adequately represent the error.

                  diff --git a/docs/build/html/search.html b/docs/build/html/search.html index 16f67a1..74ea967 100644 --- a/docs/build/html/search.html +++ b/docs/build/html/search.html @@ -3,14 +3,16 @@ - Search — pdfservices-sdk documentation - + Search — pdfservices-sdk documentation + + - + + @@ -65,7 +67,7 @@
                • Exceptions
                • diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index f07caf5..46af227 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["adobe","adobe.pdfservices","adobe.pdfservices.operation","adobe.pdfservices.operation.auth","adobe.pdfservices.operation.exception","adobe.pdfservices.operation.io","adobe.pdfservices.operation.pdfops","adobe.pdfservices.operation.pdfops.options","adobe.pdfservices.operation.pdfops.options.extractpdf","index","modules","reference/index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["adobe.rst","adobe.pdfservices.rst","adobe.pdfservices.operation.rst","adobe.pdfservices.operation.auth.rst","adobe.pdfservices.operation.exception.rst","adobe.pdfservices.operation.io.rst","adobe.pdfservices.operation.pdfops.rst","adobe.pdfservices.operation.pdfops.options.rst","adobe.pdfservices.operation.pdfops.options.extractpdf.rst","index.rst","modules.rst","reference/index.rst"],objects:{"":{adobe:[0,0,0,"-"]},"adobe.pdfservices":{operation:[2,0,0,"-"]},"adobe.pdfservices.operation":{auth:[3,0,0,"-"],client_config:[2,0,0,"-"],exception:[4,0,0,"-"],execution_context:[2,0,0,"-"],io:[5,0,0,"-"],operation:[2,0,0,"-"],pdfops:[6,0,0,"-"]},"adobe.pdfservices.operation.auth":{credentials:[3,0,0,"-"],service_account_credentials:[3,0,0,"-"]},"adobe.pdfservices.operation.auth.credentials":{Credentials:[11,1,1,""]},"adobe.pdfservices.operation.auth.credentials.Credentials":{service_account_credentials_builder:[11,2,1,""]},"adobe.pdfservices.operation.auth.service_account_credentials":{ServiceAccountCredentials:[11,1,1,""]},"adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials":{Builder:[11,1,1,"id5"],account_id:[11,2,1,""],claim:[11,2,1,""],client_id:[11,2,1,""],client_secret:[11,2,1,""],organization_id:[11,2,1,""],private_key:[11,2,1,""]},"adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials.Builder":{build:[11,2,1,"id6"],from_file:[11,2,1,"id7"],with_account_id:[11,2,1,"id8"],with_client_id:[11,2,1,"id9"],with_client_secret:[11,2,1,"id10"],with_organization_id:[11,2,1,"id11"],with_private_key:[11,2,1,"id12"]},"adobe.pdfservices.operation.client_config":{ClientConfig:[11,1,1,""]},"adobe.pdfservices.operation.client_config.ClientConfig":{Builder:[11,1,1,"id0"],builder:[11,2,1,""]},"adobe.pdfservices.operation.client_config.ClientConfig.Builder":{build:[11,2,1,"id1"],from_file:[11,2,1,"id2"],with_connect_timeout:[11,2,1,"id3"],with_read_timeout:[11,2,1,"id4"]},"adobe.pdfservices.operation.exception":{exceptions:[11,0,0,"-"]},"adobe.pdfservices.operation.exception.exceptions":{SdkException:[11,3,1,""],ServiceApiException:[11,3,1,""],ServiceUsageException:[11,3,1,""]},"adobe.pdfservices.operation.exception.exceptions.SdkException":{request_tracking_id:[11,2,1,""]},"adobe.pdfservices.operation.exception.exceptions.ServiceApiException":{DEFAULT_ERROR_CODE:[11,4,1,""],DEFAULT_STATUS_CODE:[11,4,1,""],error_code:[11,2,1,""],request_tracking_id:[11,2,1,""],status_code:[11,2,1,""]},"adobe.pdfservices.operation.exception.exceptions.ServiceUsageException":{DEFAULT_ERROR_CODE:[11,4,1,""],DEFAULT_STATUS_CODE:[11,4,1,""],error_code:[11,2,1,""],request_tracking_id:[11,2,1,""],status_code:[11,2,1,""]},"adobe.pdfservices.operation.execution_context":{ExecutionContext:[11,1,1,""]},"adobe.pdfservices.operation.execution_context.ExecutionContext":{create:[11,2,1,""]},"adobe.pdfservices.operation.io":{file_ref:[5,0,0,"-"]},"adobe.pdfservices.operation.io.file_ref":{FileRef:[11,1,1,""]},"adobe.pdfservices.operation.io.file_ref.FileRef":{create_from_local_file:[11,2,1,""],create_from_stream:[11,2,1,""],save_as:[11,2,1,""],write_to_stream:[11,2,1,""]},"adobe.pdfservices.operation.operation":{Operation:[2,1,1,""]},"adobe.pdfservices.operation.operation.Operation":{execute:[2,2,1,""]},"adobe.pdfservices.operation.pdfops":{extract_pdf_operation:[6,0,0,"-"],options:[7,0,0,"-"]},"adobe.pdfservices.operation.pdfops.autotag_pdf_operation":{AutotagPDFOperation:[11,1,1,""]},"adobe.pdfservices.operation.pdfops.autotag_pdf_operation.AutotagPDFOperation":{SUPPORTED_SOURCE_MEDIA_TYPES:[11,4,1,""],create_new:[11,2,1,""],execute:[11,2,1,""],set_input:[11,2,1,""],set_options:[11,2,1,""]},"adobe.pdfservices.operation.pdfops.extract_pdf_operation":{ExtractPDFOperation:[11,1,1,""]},"adobe.pdfservices.operation.pdfops.extract_pdf_operation.ExtractPDFOperation":{SUPPORTED_SOURCE_MEDIA_TYPES:[11,4,1,""],create_new:[11,2,1,""],execute:[11,2,1,""],set_input:[11,2,1,""],set_options:[11,2,1,""]},"adobe.pdfservices.operation.pdfops.options":{extractpdf:[8,0,0,"-"]},"adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options":{AutotagPDFOptions:[11,1,1,""]},"adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions":{Builder:[11,1,1,""],builder:[11,2,1,""],generate_report:[11,2,1,""],shift_headings:[11,2,1,""]},"adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions.Builder":{build:[11,2,1,""],with_generate_report:[11,2,1,""],with_shift_headings:[11,2,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf":{extract_element_type:[8,0,0,"-"],extract_pdf_options:[8,0,0,"-"],extract_renditions_element_type:[8,0,0,"-"],table_structure_type:[8,0,0,"-"]},"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type":{ExtractElementType:[8,1,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType":{TABLES:[8,4,1,""],TEXT:[8,4,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options":{ExtractPDFOptions:[11,1,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions":{Builder:[11,1,1,""],builder:[11,2,1,""],elements_to_extract:[11,2,1,""],elements_to_extract_renditions:[11,2,1,""],get_char_info:[11,2,1,""],include_styling_info:[11,2,1,""],table_output_format:[11,2,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions.Builder":{build:[11,2,1,""],with_element_to_extract:[11,2,1,""],with_element_to_extract_renditions:[11,2,1,""],with_elements_to_extract:[11,2,1,""],with_elements_to_extract_renditions:[11,2,1,""],with_get_char_info:[11,2,1,""],with_include_styling_info:[11,2,1,""],with_table_structure_format:[11,2,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type":{ExtractRenditionsElementType:[8,1,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType":{FIGURES:[8,4,1,""],TABLES:[8,4,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type":{TableStructureType:[8,1,1,""]},"adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType":{CSV:[8,4,1,""]},adobe:{pdfservices:[1,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","exception","Python exception"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:exception","4":"py:attribute"},terms:{"10000":[2,11],"20000":[2,11],"4000":[2,11],"429":[4,11],"abstract":[2,5,11],"boolean":[8,11],"class":[2,3,5,6,8,9,11],"default":[2,4,5,11],"enum":8,"export":[8,11],"int":[2,11],"new":[2,3,6,11],"return":[2,3,4,5,6,8,11],"static":[2,3,5,8,11],"true":[2,6,8,11],"try":[2,6,11],"while":[2,5,6,11],For:[2,3,5,11],The:[2,3,4,5,6,8,11],__file__:[2,6,11],_io:[5,11],abc:[2,3,5,11],about:11,absolut:[5,11],abspath:[2,6,11],accept:[5,11],access:[3,11],account:[3,11],account_id:[3,11],across:[2,11],add:[2,3,6,8,11],added:11,addit:[2,3,6,8,11],adequ:[4,11],adob:[10,11],adobeorg:[3,11],after:[2,11],all:[2,3,9,11],allow:[3,11],along:[6,11],ani:[2,3,5,6,8,9,11],api:[2,3,4,6,9,11],applic:[3,11],auth:[1,2],authent:[2,11],author:[3,11],autotag_output_fil:11,autotag_pdf_oper:11,autotag_pdf_opt:11,autotagpdf:11,autotagpdfinput:11,autotagpdfoutputfil:11,autotagpdfwithopt:11,base:[2,3,4,5,6,8,11],base_output_path:11,base_path:[2,6,11],been:[3,4,11],behalf:[3,11],benefit:11,bool:[8,11],bound:[8,11],box:[8,11],bufferedread:[5,11],build:[2,3,6,8,11],builder:[2,3,6,8,11],built:[2,3,11],call:[2,3,4,5,6,11],can:[2,3,8,11],charact:[8,11],claim:[3,11],classmethod:[6,11],classpath:[3,11],clean:[6,11],click:[3,9,11],client:[2,3,4,11],client_config:[0,1,11],client_config_file_path:[2,11],client_credenti:[3,11],client_id:[3,11],client_secret:[3,11],clientconfig:2,code:[4,11],com:[3,11],config:2,configur:[2,3,11],connect:[2,11],connect_timeout:[2,11],connecttimeout:[2,11],consist:[2,11],consum:[5,11],contain:11,content:[10,11],context:[2,6,11],creat:[2,3,5,6,11],create_from_local_fil:[2,5,6,11],create_from_stream:[5,11],create_kei:[6,11],create_new:[2,6,11],credenti:[1,2,4,6],credentials_file_path:[3,11],csv:[8,11],current:[2,3,8,11],custom:[2,11],default_error_cod:[4,11],default_status_cod:[4,11],defin:[2,8,11],delet:[5,11],desir:[2,11],detail:[4,11],determin:[2,11],differ:[3,11],directori:[3,5,6,11],dirnam:[2,6,11],document:[9,11],doesn:[4,11],each:[2,11],either:[4,5,11],element:[6,8,11],element_to_extract:[8,11],element_to_extract_rendit:[8,11],elements_to_extract:[8,11],elements_to_extract_rendit:[8,11],elementtyp:8,empti:[8,11],enabl:11,encapsul:[2,11],encount:[2,6,11],enterpris:[3,11],error:[4,6,11],error_cod:[4,11],establish:[2,11],etc:[5,11],exampl:[5,11],except:[1,2,6],execut:[2,5,6,11],execution_context:[0,1,6,11],executioncontext:[2,6],exhaust:[4,11],exist:11,exist_ok:11,expos:9,extens:[5,11],extension_media_type_map:[6,11],extensionmediatypemap:[6,11],extract:[3,6,8],extract_element_typ:[6,7,11],extract_pdf_oper:[1,2,11],extract_pdf_opt:[2,6,7,11],extract_renditions_element_typ:[6,7,11],extractelementtyp:[2,6,8,11],extractpdf:[6,7,11],extractpdfinput:[2,6,11],extractpdfoper:[2,6,8],extractpdfopt:[2,6,8],extractrenditionselementtyp:[2,6,8,11],extracttexttablewithfiguretablerendit:[2,6,11],factori:[3,11],failur:[4,11],figur:[2,6,8,11],file:[2,3,5,6,8,11],file_ref:[1,2,6,11],fileref:[2,5,6],format:[3,5,6,8,11],from:[2,3,5,6,8,11],from_fil:[2,3,6,11],gener:11,generate_report:11,get:[3,9,11],get_char_info:[8,11],greater:[2,11],has:[3,4,11],have:[8,11],head:11,here:[3,11],how:[6,11],http:[2,4,11],identifi:[3,5,11],improv:11,ims_base_uri:[3,11],include_styling_info:[8,11],infer:[5,11],info:[8,11],inform:[8,11],input:[6,8,11],input_file_nam:11,input_file_path:11,input_stream:[5,11],instanc:[2,3,5,6,8,11],intern:[3,6,11],issu:[3,11],itself:[3,11],json:[2,3,6,8,11],jwt_base_uri:[3,11],kei:[2,3,11],left:9,level:[8,11],limit:[4,11],list:[8,11],local:[5,11],local_file_path:[5,11],local_sourc:[5,11],locat:[5,11],log:[2,6,11],look:[3,11],low:11,mai:[6,11],marker:[3,11],media:[5,11],media_typ:[5,11],messag:[4,11],method:[3,5,11],millisecond:[2,11],mime_typ:[6,11],mkdir:11,modul:[9,10],most:11,nav:9,need:[8,11],network:[4,11],none:[2,3,4,5,8,11],number:[2,11],object:[2,3,8,11],onli:[3,8,11],oper:[0,1,9,11],option:[2,3,5,6,11],org_id:[3,11],organ:[3,11],organization_id:[3,11],output:[2,6,8,11],packag:10,paramet:[2,3,5,6,8,11],parent:11,path:[2,3,5,6,11],pdf:[2,3,6,8],pdf_version:[],pdfop:[1,2,11],pdfservic:[0,10,11],pdfversion:[],pem:[3,11],pleas:9,privat:[3,11],private_kei:[3,11],private_key_fil:[3,11],properti:[3,4,8,11],provid:[2,5,11],qualiti:11,quota:[4,11],rais:[6,8,11],reach:[4,11],read:[2,5,11],read_timeout:[2,11],readabl:[5,11],readtimeout:[2,11],refer:[5,9,11],rel:[5,11],rendit:[6,8,11],replac:11,report:11,report_path:11,repres:[2,4,5,11],request:[2,4,11],request_tracking_id:[4,11],resourc:[2,6,11],respons:[2,6,11],result:[2,4,6,11],reus:[2,11],sampl:[2,6,11],save:[5,11],save_a:[2,5,6,11],save_pdf_fil:11,save_xls_fil:11,sdk:[5,11],sdkexcept:[2,4,6,11],secret:[3,11],section:9,see:[6,11],send:[2,11],server:[2,11],servic:[3,4,11],service_account_credenti:[1,2,11],service_account_credentials_build:[2,3,6,11],service_const:[3,11],serviceaccountcredenti:3,serviceapiexcept:[2,4,6,11],serviceconst:[3,11],serviceusageerror:[4,11],serviceusageexcept:[2,4,6,11],set:[2,3,6,8,11],set_input:[2,6,11],set_opt:[2,6,11],shift:11,shift_head:11,should:[2,11],side:[4,11],sourc:[2,6,11],source_file_ref:[6,11],specifi:[5,8,11],start:9,state:[2,3,11],statu:[4,11],status_cod:[4,11],stem:11,store:[6,11],str:[2,3,5,8,11],stream:[5,11],structur:[2,3,6,8,11],style:[8,11],submodul:[0,1,7],subpackag:10,suppli:[6,11],support:[3,6,8,11],supported_source_media_typ:[6,11],synchron:[6,11],system:[6,11],tabl:[2,6,8,11],table_output_format:[8,11],table_structur:[8,11],table_structure_typ:[6,7,11],tablestructuretyp:[8,11],tag:11,tagged_pdf_path:11,techacct:[3,11],temporari:[5,6,11],text:[2,6,8,11],than:[2,11],thi:[2,3,4,5,6,8,9,11],thrown:[4,11],timeout:[2,11],token:[3,11],tool:[3,11],track:[4,11],type:[2,3,5,6,8,11],typic:[2,4,5,11],underli:[4,11],unknown:[4,11],until:[2,11],usag:[2,4,6,11],used:[3,5,11],using:[2,3,5,6,11],v17:[],v20:[],valu:[2,4,8,11],valueerror:[8,11],version:[],wait:[2,11],when:[4,5,11],whether:[8,11],which:[3,5,6,8,11],whose:[8,11],with_account_id:[3,11],with_client_id:[3,11],with_client_secret:[3,11],with_connect_timeout:[2,11],with_element_to_extract:[8,11],with_element_to_extract_rendit:[8,11],with_elements_to_extract:[2,6,8,11],with_elements_to_extract_rendit:[2,6,8,11],with_generate_report:11,with_get_char_info:[2,6,8,11],with_include_styling_info:[6,8,11],with_organization_id:[3,11],with_pdf_vers:[],with_private_kei:[3,11],with_read_timeout:[2,11],with_shift_head:11,with_table_structure_format:[8,11],within:[3,11],work:[5,11],write_to_stream:[5,11],writer_stream:[5,11],xlsx:11,your:[3,11],zero:[2,11],zip:[2,6,11]},titles:["adobe package","adobe.pdfservices package","adobe.pdfservices.operation package","adobe.pdfservices.operation.auth package","adobe.pdfservices.operation.exception package","adobe.pdfservices.operation.io package","adobe.pdfservices.operation.pdfops package","adobe.pdfservices.operation.pdfops.options package","adobe.pdfservices.operation.pdfops.options.extractpdf package","pdfservices-sdk","src","Overview"],titleterms:{adob:[0,1,2,3,4,5,6,7,8],auth:[3,11],autotag:11,autotagpdfoper:11,autotagpdfopt:11,client_config:2,clientconfig:11,clientconfigbuild:11,config:11,content:[0,1,2,3,4,5,6,7,8],credenti:[3,11],except:[4,11],execution_context:2,executioncontext:11,extract:11,extract_element_typ:8,extract_pdf_oper:6,extract_pdf_opt:8,extract_renditions_element_typ:8,extractpdf:8,extractpdfoper:11,extractpdfopt:11,file_ref:5,fileref:11,modul:[0,1,2,3,4,5,6,7,8],oper:[2,3,4,5,6,7,8],option:[7,8],overview:11,packag:[0,1,2,3,4,5,6,7,8],pdf:11,pdfop:[6,7,8],pdfservic:[1,2,3,4,5,6,7,8,9],sdk:9,service_account_credenti:3,serviceaccountcredenti:11,serviceaccountcredentialsbuild:11,src:10,submodul:[2,3,4,5,6,8],subpackag:[0,1,2,6,7],table_structure_typ:8}}) \ No newline at end of file +Search.setIndex({docnames:["adobe","adobe.pdfservices","adobe.pdfservices.operation","adobe.pdfservices.operation.auth","adobe.pdfservices.operation.exception","adobe.pdfservices.operation.io","adobe.pdfservices.operation.pdfops","adobe.pdfservices.operation.pdfops.options","adobe.pdfservices.operation.pdfops.options.extractpdf","index","modules","reference/index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["adobe.rst","adobe.pdfservices.rst","adobe.pdfservices.operation.rst","adobe.pdfservices.operation.auth.rst","adobe.pdfservices.operation.exception.rst","adobe.pdfservices.operation.io.rst","adobe.pdfservices.operation.pdfops.rst","adobe.pdfservices.operation.pdfops.options.rst","adobe.pdfservices.operation.pdfops.options.extractpdf.rst","index.rst","modules.rst","reference/index.rst"],objects:{"":[[0,0,0,"-","adobe"]],"adobe.pdfservices":[[2,0,0,"-","operation"]],"adobe.pdfservices.operation":[[3,0,0,"-","auth"],[2,0,0,"-","client_config"],[4,0,0,"-","exception"],[2,0,0,"-","execution_context"],[5,0,0,"-","io"],[2,0,0,"-","operation"],[6,0,0,"-","pdfops"]],"adobe.pdfservices.operation.auth":[[3,0,0,"-","credentials"],[3,0,0,"-","service_account_credentials"]],"adobe.pdfservices.operation.auth.credentials":[[11,1,1,"","Credentials"]],"adobe.pdfservices.operation.auth.credentials.Credentials":[[11,2,1,"","service_account_credentials_builder"]],"adobe.pdfservices.operation.auth.service_account_credentials":[[11,1,1,"","ServiceAccountCredentials"]],"adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials":[[11,1,1,"id6","Builder"],[11,3,1,"","account_id"],[11,3,1,"","claim"],[11,3,1,"","client_id"],[11,3,1,"","client_secret"],[11,3,1,"","organization_id"],[11,3,1,"","private_key"]],"adobe.pdfservices.operation.auth.service_account_credentials.ServiceAccountCredentials.Builder":[[11,2,1,"id7","build"],[11,2,1,"id8","from_file"],[11,2,1,"id9","with_account_id"],[11,2,1,"id10","with_client_id"],[11,2,1,"id11","with_client_secret"],[11,2,1,"id12","with_organization_id"],[11,2,1,"id13","with_private_key"]],"adobe.pdfservices.operation.client_config":[[11,1,1,"","ClientConfig"]],"adobe.pdfservices.operation.client_config.ClientConfig":[[11,1,1,"id0","Builder"],[11,2,1,"","builder"]],"adobe.pdfservices.operation.client_config.ClientConfig.Builder":[[11,2,1,"id1","build"],[11,2,1,"id2","from_file"],[11,2,1,"id3","with_connect_timeout"],[11,2,1,"id4","with_pdf_services_uri"],[11,2,1,"id5","with_read_timeout"]],"adobe.pdfservices.operation.exception":[[11,0,0,"-","exceptions"]],"adobe.pdfservices.operation.exception.exceptions":[[11,4,1,"","SdkException"],[11,4,1,"","ServiceApiException"],[11,4,1,"","ServiceUsageException"]],"adobe.pdfservices.operation.exception.exceptions.SdkException":[[11,3,1,"","request_tracking_id"]],"adobe.pdfservices.operation.exception.exceptions.ServiceApiException":[[11,5,1,"","DEFAULT_ERROR_CODE"],[11,5,1,"","DEFAULT_STATUS_CODE"],[11,3,1,"","error_code"],[11,3,1,"","request_tracking_id"],[11,3,1,"","status_code"]],"adobe.pdfservices.operation.exception.exceptions.ServiceUsageException":[[11,5,1,"","DEFAULT_ERROR_CODE"],[11,5,1,"","DEFAULT_STATUS_CODE"],[11,3,1,"","error_code"],[11,3,1,"","request_tracking_id"],[11,3,1,"","status_code"]],"adobe.pdfservices.operation.execution_context":[[11,1,1,"","ExecutionContext"]],"adobe.pdfservices.operation.execution_context.ExecutionContext":[[11,2,1,"","create"]],"adobe.pdfservices.operation.io":[[5,0,0,"-","file_ref"]],"adobe.pdfservices.operation.io.file_ref":[[11,1,1,"","FileRef"]],"adobe.pdfservices.operation.io.file_ref.FileRef":[[11,2,1,"","create_from_local_file"],[11,2,1,"","create_from_stream"],[11,2,1,"","get_media_type"],[11,2,1,"","save_as"],[11,2,1,"","write_to_stream"]],"adobe.pdfservices.operation.operation":[[2,1,1,"","Operation"]],"adobe.pdfservices.operation.operation.Operation":[[2,2,1,"","execute"]],"adobe.pdfservices.operation.pdfops":[[6,0,0,"-","extract_pdf_operation"],[7,0,0,"-","options"]],"adobe.pdfservices.operation.pdfops.autotag_pdf_operation":[[11,1,1,"","AutotagPDFOperation"]],"adobe.pdfservices.operation.pdfops.autotag_pdf_operation.AutotagPDFOperation":[[11,5,1,"","SUPPORTED_SOURCE_MEDIA_TYPES"],[11,2,1,"","create_new"],[11,2,1,"","execute"],[11,2,1,"","get_options"],[11,2,1,"","set_input"],[11,2,1,"","set_options"]],"adobe.pdfservices.operation.pdfops.extract_pdf_operation":[[11,1,1,"","ExtractPDFOperation"]],"adobe.pdfservices.operation.pdfops.extract_pdf_operation.ExtractPDFOperation":[[11,5,1,"","SUPPORTED_SOURCE_MEDIA_TYPES"],[11,2,1,"","create_new"],[11,2,1,"","execute"],[11,2,1,"","get_options"],[11,2,1,"","set_input"],[11,2,1,"","set_options"]],"adobe.pdfservices.operation.pdfops.options":[[8,0,0,"-","extractpdf"]],"adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options":[[11,1,1,"","AutotagPDFOptions"]],"adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions":[[11,1,1,"","Builder"],[11,2,1,"","builder"],[11,3,1,"","generate_report"],[11,3,1,"","shift_headings"]],"adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options.AutotagPDFOptions.Builder":[[11,2,1,"","build"],[11,2,1,"","with_generate_report"],[11,2,1,"","with_shift_headings"]],"adobe.pdfservices.operation.pdfops.options.extractpdf":[[8,0,0,"-","extract_element_type"],[8,0,0,"-","extract_pdf_options"],[8,0,0,"-","extract_renditions_element_type"],[8,0,0,"-","table_structure_type"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type":[[8,1,1,"","ExtractElementType"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type.ExtractElementType":[[8,5,1,"","TABLES"],[8,5,1,"","TEXT"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options":[[11,1,1,"","ExtractPDFOptions"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions":[[11,1,1,"","Builder"],[11,2,1,"","builder"],[11,3,1,"","elements_to_extract"],[11,3,1,"","elements_to_extract_renditions"],[11,3,1,"","get_char_info"],[11,3,1,"","include_styling_info"],[11,3,1,"","table_output_format"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options.ExtractPDFOptions.Builder":[[11,2,1,"","build"],[11,2,1,"","with_element_to_extract"],[11,2,1,"","with_element_to_extract_renditions"],[11,2,1,"","with_elements_to_extract"],[11,2,1,"","with_elements_to_extract_renditions"],[11,2,1,"","with_get_char_info"],[11,2,1,"","with_include_styling_info"],[11,2,1,"","with_table_structure_format"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type":[[8,1,1,"","ExtractRenditionsElementType"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type.ExtractRenditionsElementType":[[8,5,1,"","FIGURES"],[8,5,1,"","TABLES"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type":[[8,1,1,"","TableStructureType"]],"adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type.TableStructureType":[[8,5,1,"","CSV"]],adobe:[[1,0,0,"-","pdfservices"]]},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","property","Python property"],"4":["py","exception","Python exception"],"5":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:property","4":"py:exception","5":"py:attribute"},terms:{"0":[4,11],"10000":[2,11],"20000":[2,11],"4000":[2,11],"429":[4,11],"abstract":[2,5,11],"boolean":[8,11],"class":[2,3,5,6,8,9,11],"default":[2,4,5,11],"enum":8,"export":[8,11],"int":[2,11],"new":[2,3,6,11],"return":[2,3,4,5,6,8,11],"static":[2,3,5,8,11],"true":[2,6,8,11],"try":[2,6,11],"while":[2,5,6,11],A:[2,3,5,6,11],For:[2,3,5,11],If:[5,11],It:[2,3,5,11],The:[2,3,4,5,6,8,11],__file__:[2,6,11],_io:[5,11],abc:[2,3,5,11],about:11,absolut:[5,11],abspath:[2,6,11],accept:[5,11],access:[3,11],account:[3,11],account_id:[3,11],across:[2,11],ad:11,add:[2,3,6,8,11],addit:[2,3,6,8,11],adequ:[4,11],adob:[10,11],adobeorg:[3,11],after:[2,11],all:[2,3,9,11],allow:[3,11],along:[6,11],an:[2,3,4,5,6,8,11],ani:[2,3,5,6,8,9,11],api:[2,3,4,6,9,11],applic:[3,11],ar:[2,3,6,11],auth:[1,2],authent:[2,11],author:[3,11],autotag_output_fil:11,autotag_pdf_oper:11,autotag_pdf_opt:11,autotagpdf:11,autotagpdfinput:11,autotagpdfoutputfil:11,autotagpdfwithopt:11,base:[2,3,4,5,6,8,11],base_output_path:11,base_path:[2,6,11],been:[3,4,11],behalf:[3,11],benefit:11,bool:[8,11],bound:[8,11],box:[8,11],bufferedread:[5,11],build:[2,3,6,8,11],builder:[2,3,6,8,11],built:[2,3,11],call:[2,3,4,5,6,11],can:[2,3,8,11],charact:[8,11],claim:[3,11],classmethod:[6,11],classpath:[3,11],clean:[6,11],click:[3,9,11],client:[2,3,4,11],client_config:[0,1,11],client_config_file_path:[2,11],client_credenti:[3,11],client_id:[3,11],client_secret:[3,11],clientconfig:2,code:[4,11],com:[3,11],config:2,configur:[2,3,11],connect:[2,11],connect_timeout:[2,11],connecttimeout:[2,11],consist:[2,11],constant:[3,11],consum:[5,11],contain:11,content:[10,11],context:[2,6,11],creat:[2,3,5,6,11],create_from_local_fil:[2,5,6,11],create_from_stream:[5,11],create_kei:[6,11],create_new:[2,6,11],credenti:[1,2,4,6],credentials_file_path:[3,11],csv:[8,11],current:[2,3,8,11],custom:[2,11],default_error_cod:[4,11],default_status_cod:[4,11],defin:[2,8,11],delet:[5,11],desir:[2,11],detail:[4,11],determin:[2,11],differ:[3,11],directori:[3,5,6,11],dirnam:[2,6,11],document:[9,11],doesn:[4,11],e:[5,11],each:[2,11],either:[4,5,11],element:[6,8,11],element_to_extract:[8,11],element_to_extract_rendit:[8,11],elements_to_extract:[8,11],elements_to_extract_rendit:[8,11],elementtyp:8,empti:[8,11],enabl:11,encapsul:[2,11],encount:[2,6,11],enterpris:[3,11],error:[4,6,11],error_cod:[4,11],establish:[2,11],etc:[5,11],eu:[],exampl:[5,11],except:[1,2,6],execut:[2,5,6,11],execution_context:[0,1,6,11],executioncontext:[2,6],exhaust:[4,11],exist:11,exist_ok:11,expos:9,extens:[5,11],extension_media_type_map:[6,11],extensionmediatypemap:[6,11],extract:[3,6,8],extract_element_typ:[6,7,11],extract_pdf_oper:[1,2,11],extract_pdf_opt:[2,6,7,11],extract_renditions_element_typ:[6,7,11],extractelementtyp:[2,6,8,11],extractpdf:[6,7,11],extractpdfinput:[2,6,11],extractpdfoper:[2,6,8],extractpdfopt:[2,6,8],extractrenditionselementtyp:[2,6,8,11],extracttexttablewithfiguretablerendit:[2,6,11],f:11,factori:[3,11],failur:[4,11],figur:[2,6,8,11],file:[2,3,5,6,8,11],file_ref:[1,2,6,11],fileref:[2,5,6],format:[3,5,6,8,11],from:[2,3,5,6,8,11],from_fil:[2,3,6,11],gener:11,generate_report:11,get:[3,6,9,11],get_char_info:[8,11],get_media_typ:[5,11],get_opt:[6,11],greater:[2,11],ha:[3,4,11],have:[8,11],head:11,here:[3,11],how:[6,11],http:[2,4,11],i:[5,11],id:[3,4,11],identifi:[3,5,11],improv:11,ims_base_uri:[3,11],include_styling_info:[8,11],infer:[5,11],info:[8,11],inform:[8,11],input:[6,8,11],input_file_nam:11,input_file_path:11,input_stream:[5,11],instanc:[2,3,5,6,8,11],intern:[3,6,11],io:[1,2,6],issu:[3,11],itself:[3,11],json:[2,3,6,8,11],jwt_base_uri:[3,11],kei:[2,3,11],left:9,level:[8,11],limit:[4,11],link:[2,11],list:[8,11],local:[5,11],local_file_path:[5,11],local_sourc:[5,11],locat:[5,11],log:[2,6,11],look:[3,11],low:11,mai:[6,11],marker:[3,11],media:[5,11],media_typ:[5,11],messag:[4,11],method:[3,5,11],millisecond:[2,11],mime_typ:[6,11],mkdir:11,modul:[9,10],most:11,nav:9,need:[8,11],network:[4,11],none:[2,3,4,5,8,11],number:[2,11],object:[2,3,8,11],onli:[3,8,11],oper:[0,1,9,11],option:[2,3,5,6,11],org_id:[3,11],organ:[3,11],organization_id:[3,11],os:[2,6,11],output:[2,6,8,11],packag:10,param:[],paramet:[2,3,5,6,8,11],parent:11,path:[2,3,5,6,11],pdf:[2,3,6,8],pdf_services_uri:[2,11],pdf_services_url:[],pdfop:[1,2,11],pdfservic:[0,10,11],pem:[3,11],pleas:9,privat:[3,11],private_kei:[3,11],private_key_fil:[3,11],properti:[3,4,8,11],provid:[2,5,11],qualiti:11,quota:[4,11],rais:[6,8,11],reach:[4,11],read:[2,5,11],read_timeout:[2,11],readabl:[5,11],readtimeout:[2,11],refer:[5,9,11],region:[],rel:[5,11],rendit:[6,8,11],replac:11,report:11,report_path:11,repres:[2,4,5,11],request:[2,4,11],request_tracking_id:[4,11],resourc:[2,6,11],respons:[2,6,11],rest:[2,11],result:[2,4,6,11],reus:[2,11],rtype:[],sampl:[2,6,11],save:[5,11],save_a:[2,5,6,11],save_pdf_fil:11,save_xls_fil:11,sdk:[5,11],sdkexcept:[2,4,6,11],secret:[3,11],section:9,see:[6,11],send:[2,11],server:[2,11],servic:[2,3,4,11],service_account_credenti:[1,2,11],service_account_credentials_build:[2,3,6,11],service_const:[3,11],serviceaccountcredenti:3,serviceapiexcept:[2,4,6,11],serviceconst:[3,11],serviceusageerror:[4,11],serviceusageexcept:[2,4,6,11],set:[2,3,6,8,11],set_input:[2,6,11],set_opt:[2,6,11],shift:11,shift_head:11,should:[2,11],side:[4,11],so:11,sourc:[2,6,11],source_file_ref:[6,11],specifi:[5,8,11],start:9,state:[2,3,11],statu:[4,11],status_cod:[4,11],stem:11,store:[6,11],str:[2,3,5,8,11],stream:[5,11],structur:[2,3,6,8,11],style:[8,11],submodul:[0,1,7],subpackag:10,suppli:[6,11],support:[3,6,8,11],supported_source_media_typ:[6,11],synchron:[6,11],system:[6,11],t:[4,11],tabl:[2,6,8,11],table_output_format:[8,11],table_structur:[8,11],table_structure_typ:[6,7,11],tablestructuretyp:[8,11],tag:11,tagged_pdf_path:11,techacct:[3,11],temporari:[5,6,11],text:[2,6,8,11],than:[2,11],thi:[2,3,4,5,6,8,9,11],thrown:[4,11],timeout:[2,11],token:[3,11],tool:[3,11],track:[4,11],type:[2,3,5,6,8,11],typic:[2,4,5,11],underli:[4,11],unknown:[4,11],until:[2,11],up:[3,6,11],uri:[2,11],url:[2,11],us:[2,3,5,6,11],usag:[2,4,6,11],valu:[2,4,8,11],valueerror:[8,11],wait:[2,11],when:[4,5,11],whether:[8,11],which:[3,5,6,8,11],whose:[8,11],with_account_id:[3,11],with_client_id:[3,11],with_client_secret:[3,11],with_connect_timeout:[2,11],with_element_to_extract:[8,11],with_element_to_extract_rendit:[8,11],with_elements_to_extract:[2,6,8,11],with_elements_to_extract_rendit:[2,6,8,11],with_generate_report:11,with_get_char_info:[2,6,8,11],with_include_styling_info:[6,8,11],with_organization_id:[3,11],with_pdf_services_uri:[2,11],with_private_kei:[3,11],with_read_timeout:[2,11],with_shift_head:11,with_table_structure_format:[8,11],within:[3,11],work:[5,11],write_to_stream:[5,11],writer_stream:[5,11],xlsx:11,your:[3,11],zero:[2,11],zip:[2,6,11]},titles:["adobe package","adobe.pdfservices package","adobe.pdfservices.operation package","adobe.pdfservices.operation.auth package","adobe.pdfservices.operation.exception package","adobe.pdfservices.operation.io package","adobe.pdfservices.operation.pdfops package","adobe.pdfservices.operation.pdfops.options package","adobe.pdfservices.operation.pdfops.options.extractpdf package","pdfservices-sdk","src","Overview"],titleterms:{adob:[0,1,2,3,4,5,6,7,8],auth:[3,11],autotag:11,autotagpdfoper:11,autotagpdfopt:11,client_config:2,clientconfig:11,clientconfigbuild:11,config:11,content:[0,1,2,3,4,5,6,7,8],credenti:[3,11],except:[4,11],execution_context:2,executioncontext:11,extract:11,extract_element_typ:8,extract_pdf_oper:6,extract_pdf_opt:8,extract_renditions_element_typ:8,extractpdf:8,extractpdfoper:11,extractpdfopt:11,file_ref:5,fileref:11,io:[5,11],modul:[0,1,2,3,4,5,6,7,8],oper:[2,3,4,5,6,7,8],option:[7,8],overview:11,packag:[0,1,2,3,4,5,6,7,8],pdf:11,pdfop:[6,7,8],pdfservic:[1,2,3,4,5,6,7,8,9],sdk:9,service_account_credenti:3,serviceaccountcredenti:11,serviceaccountcredentialsbuild:11,src:10,submodul:[2,3,4,5,6,8],subpackag:[0,1,2,6,7],table_structure_typ:8}}) \ No newline at end of file diff --git a/setup.py b/setup.py index cb831b7..988b6ce 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ def parse_requirements(filename, session=None): setuptools.setup( name="pdfservices-sdk", - version="1.0.2b2", + version="2.0.0b1", author='Adobe Document Services', author_email='extractapi@adobe.com', license='Apache2', diff --git a/src/adobe/pdfservices/operation/auth/service_account_credentials.py b/src/adobe/pdfservices/operation/auth/service_account_credentials.py index 05e81eb..a401d17 100644 --- a/src/adobe/pdfservices/operation/auth/service_account_credentials.py +++ b/src/adobe/pdfservices/operation/auth/service_account_credentials.py @@ -11,7 +11,7 @@ import os from abc import ABC -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants from adobe.pdfservices.operation.internal.util import path_util, file_utils from .credentials import Credentials from ..internal.util.validation_util import is_empty diff --git a/src/adobe/pdfservices/operation/client_config.py b/src/adobe/pdfservices/operation/client_config.py index 5f57bae..6fcda71 100644 --- a/src/adobe/pdfservices/operation/client_config.py +++ b/src/adobe/pdfservices/operation/client_config.py @@ -9,7 +9,7 @@ # governing permissions and limitations under the License. import json -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants from adobe.pdfservices.operation.internal.util import file_utils @@ -19,9 +19,8 @@ class ClientConfig(object): """ _CONNECT_TIMEOUT_KEY = "connectTimeout" _READ_TIMEOUT_KEY = "readTimeout" - _CPF_SERVICES_KEY = "cpfServices" - _CPF_SERVICES_OPS_CREATE_KEY = "cpfOpsCreateUri" - _CPF_EXTRACT_ANALYZER_ID = "cpfExtractAnalyzerId" + _PDF_SERVICES = "pdf_services" + _PDF_SERVICES_URI = "pdf_services_uri" @staticmethod def builder(): @@ -42,8 +41,7 @@ class Builder: def __init__(self): self._connect_timeout = ServiceConstants.HTTP_CONNECT_TIMEOUT self._read_timeout = ServiceConstants.HTTP_READ_TIMEOUT - self._cpf_ops_create_uri = ServiceConstants.CPF_OPS_CREATE_URI - self._cpf_extract_analyzer_id = ServiceConstants.CPF_OPS_EXTRACT_ANALYZER_ID + self._pdf_services_uri = ServiceConstants.PDF_SERVICES_URI # the time it allows for the client to establish a connection to the server def with_connect_timeout(self, connect_timeout: int): @@ -58,6 +56,17 @@ def with_connect_timeout(self, connect_timeout: int): self._connect_timeout = connect_timeout return self + def with_pdf_services_uri(self, pdf_services_uri: str): + """Sets the pdf services uri link. + + :param pdf_services_uri: url for the new rest api + :type pdf_services_uri: str + :return: This Builder instance to add any additional parameters. + :rtype: ClientConfig.Builder + """ + self._pdf_services_uri = pdf_services_uri + return self + # the time it will wait on a response once connection is estalished def with_read_timeout(self, read_timeout: int): """Sets the read timeout. It should be greater than zero. @@ -95,11 +104,11 @@ def from_file(self, client_config_file_path: str): config_dict = json.loads(config_json_str) self._connect_timeout = int(config_dict.get(ClientConfig._CONNECT_TIMEOUT_KEY, self._connect_timeout)) self._read_timeout = int(config_dict.get(ClientConfig._READ_TIMEOUT_KEY, self._read_timeout)) - cpf_services_config = config_dict.get(ClientConfig._CPF_SERVICES_KEY, {}) - self._cpf_ops_create_uri = cpf_services_config.get(ClientConfig._CPF_SERVICES_OPS_CREATE_KEY, - self._cpf_ops_create_uri) - self._cpf_extract_analyzer_id = cpf_services_config.get(ClientConfig._CPF_EXTRACT_ANALYZER_ID, - self._cpf_extract_analyzer_id) + pdf_services_config = config_dict.get(ClientConfig._PDF_SERVICES) + if pdf_services_config: + pdf_services_uri_node = pdf_services_config.get(ClientConfig._PDF_SERVICES_URI) + if pdf_services_uri_node: + self._pdf_services_uri = pdf_services_uri_node return self def build(self): @@ -110,5 +119,4 @@ def build(self): :rtype: ClientConfig """ from adobe.pdfservices.operation.internal.internal_client_config import InternalClientConfig - return InternalClientConfig(self._connect_timeout, self._read_timeout, self._cpf_ops_create_uri, - self._cpf_extract_analyzer_id) + return InternalClientConfig(self._connect_timeout, self._read_timeout, self._pdf_services_uri) diff --git a/src/adobe/pdfservices/operation/internal/api/dto/request/__init__.py b/src/adobe/pdfservices/operation/internal/api/dto/request/__init__.py index e69de29..5746b24 100644 --- a/src/adobe/pdfservices/operation/internal/api/dto/request/__init__.py +++ b/src/adobe/pdfservices/operation/internal/api/dto/request/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. \ No newline at end of file diff --git a/src/adobe/pdfservices/operation/internal/api/dto/request/asset_upload_uri_request.py b/src/adobe/pdfservices/operation/internal/api/dto/request/asset_upload_uri_request.py new file mode 100644 index 0000000..96ad5dc --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/dto/request/asset_upload_uri_request.py @@ -0,0 +1,29 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +import json + +from adobe.pdfservices.operation.internal.util.json_hint_encoder import JSONHintEncoder + + +class AssetUploadURIRequest: + json_hint = { + 'mediaType': 'mediaType' + } + + def __init__(self, media_type: str): + super().__init__() + self.mediaType = media_type + + @property + def media_type(self): + return self.mediaType + + def to_json(self): + return json.dumps(self, cls=JSONHintEncoder, indent=1, sort_keys=True) diff --git a/src/adobe/pdfservices/operation/internal/api/dto/request/autotagpdf/autotag_pdf_request.py b/src/adobe/pdfservices/operation/internal/api/dto/request/autotagpdf/autotag_pdf_request.py new file mode 100644 index 0000000..a770303 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/dto/request/autotagpdf/autotag_pdf_request.py @@ -0,0 +1,38 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +import json +from adobe.pdfservices.operation.internal.util.json_hint_encoder import JSONHintEncoder + +from adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options import AutotagPDFOptions +from adobe.pdfservices.operation.internal.api.dto.request.platform.platform_api_request import PlatformApiRequest + + +class AutotagPDFRequest(PlatformApiRequest): + json_hint = { + 'asset_id': 'assetID', + 'generate_report': 'generateReport', + 'shift_headings': 'shiftHeadings' + } + + def __init__(self, asset_id: str= None, generate_report: bool = None, shift_headings: bool = None): + super().__init__() + self.asset_id = asset_id + self.generate_report = generate_report + self.shift_headings = shift_headings + + @classmethod + def from_autotag_pdf_options(cls, asset_id, autotag_pdf_options: AutotagPDFOptions = None): + if autotag_pdf_options is None: + return cls(asset_id=asset_id) + return cls(asset_id=asset_id,generate_report=autotag_pdf_options.generate_report, + shift_headings=autotag_pdf_options.shift_headings) + + def to_json(self): + return json.dumps(self, cls=JSONHintEncoder, indent=1, sort_keys=True) diff --git a/src/adobe/pdfservices/operation/internal/api/dto/request/extract_pdf_request.py b/src/adobe/pdfservices/operation/internal/api/dto/request/extract_pdf_request.py new file mode 100644 index 0000000..59e2bc9 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/dto/request/extract_pdf_request.py @@ -0,0 +1,57 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +import json +from typing import List + +from adobe.pdfservices.operation.internal.util.json_hint_encoder import JSONHintEncoder + +from adobe.pdfservices.operation.internal.api.dto.request.platform.platform_api_request import PlatformApiRequest +from adobe.pdfservices.operation.pdfops.options.extractpdf.extract_element_type import ExtractElementType +from adobe.pdfservices.operation.pdfops.options.extractpdf.extract_renditions_element_type import \ + ExtractRenditionsElementType +from adobe.pdfservices.operation.pdfops.options.extractpdf.table_structure_type import TableStructureType +from adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options import ExtractPDFOptions + + +class ExtractPDFRequest(PlatformApiRequest): + json_hint = { + 'asset_id': 'assetID', + 'elements_to_extract': 'elementsToExtract', + 'renditions_to_extract': 'renditionsToExtract', + 'table_output_format': 'tableOutputFormat', + 'extract_char_info': 'getCharBounds', + 'include_styling_info': 'includeStyling' + } + + def __init__(self, asset_id: str = None, elements_to_extract: List[ExtractElementType] = None, + renditions_to_extract: List[ExtractRenditionsElementType] = None, table_output_format: TableStructureType = None, + extract_char_info: bool = None, include_styling_info: bool = None): + super().__init__() + self.asset_id = asset_id + self.elements_to_extract = elements_to_extract + self.renditions_to_extract = renditions_to_extract + self.table_output_format = table_output_format + self.extract_char_info = extract_char_info + self.include_styling_info = include_styling_info + + @classmethod + def from_extract_pdf_options(cls, asset_id: str = None, extract_pdf_options: ExtractPDFOptions = None): + if extract_pdf_options: + return cls(asset_id=asset_id, + elements_to_extract=extract_pdf_options.elements_to_extract, + renditions_to_extract=extract_pdf_options.elements_to_extract_renditions, + table_output_format=extract_pdf_options.table_output_format, + extract_char_info=extract_pdf_options.get_char_info, + include_styling_info=extract_pdf_options.include_styling_info) + else: + return cls(asset_id=asset_id, elements_to_extract=[ExtractElementType.TEXT]) + + def to_json(self): + return json.dumps(self, cls=JSONHintEncoder, indent=1, sort_keys=True) diff --git a/src/adobe/pdfservices/operation/internal/api/dto/request/platform/__init__.py b/src/adobe/pdfservices/operation/internal/api/dto/request/platform/__init__.py index e69de29..5746b24 100644 --- a/src/adobe/pdfservices/operation/internal/api/dto/request/platform/__init__.py +++ b/src/adobe/pdfservices/operation/internal/api/dto/request/platform/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. \ No newline at end of file diff --git a/src/adobe/pdfservices/operation/internal/api/dto/request/platform/platform_api_request.py b/src/adobe/pdfservices/operation/internal/api/dto/request/platform/platform_api_request.py new file mode 100644 index 0000000..4e3ce13 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/dto/request/platform/platform_api_request.py @@ -0,0 +1,16 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +from abc import ABC + +class PlatformApiRequest(ABC): + + + def __init__(self): + return diff --git a/src/adobe/pdfservices/operation/internal/api/dto/response/__init__.py b/src/adobe/pdfservices/operation/internal/api/dto/response/__init__.py index e69de29..5746b24 100644 --- a/src/adobe/pdfservices/operation/internal/api/dto/response/__init__.py +++ b/src/adobe/pdfservices/operation/internal/api/dto/response/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. \ No newline at end of file diff --git a/src/adobe/pdfservices/operation/internal/api/dto/response/job_status.py b/src/adobe/pdfservices/operation/internal/api/dto/response/job_status.py new file mode 100644 index 0000000..5c16aee --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/dto/response/job_status.py @@ -0,0 +1,19 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +import enum + + +class JobStatus(str, enum.Enum): + """ + enum of status of the response + """ + IN_PROGRESS = "in_progress" + FAILED = "failed" + DONE = "done" diff --git a/src/adobe/pdfservices/operation/internal/api/dto/response/platform/__init__.py b/src/adobe/pdfservices/operation/internal/api/dto/response/platform/__init__.py index e69de29..5746b24 100644 --- a/src/adobe/pdfservices/operation/internal/api/dto/response/platform/__init__.py +++ b/src/adobe/pdfservices/operation/internal/api/dto/response/platform/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. \ No newline at end of file diff --git a/src/adobe/pdfservices/operation/internal/api/dto/response/platform/job_error_response.py b/src/adobe/pdfservices/operation/internal/api/dto/response/platform/job_error_response.py new file mode 100644 index 0000000..34a1c17 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/dto/response/platform/job_error_response.py @@ -0,0 +1,30 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +class JobErrorResponse: + + json_hint = { + 'code': 'code', + 'status': 'status', + 'message': 'message' + } + + def __init__(self, code: str, message : str, status: int): + self.code = code + self.message = message + self.status = status + + def get_code(self): + return self.code + + def get_message(self): + return self.message + + def get_status(self): + return self.status diff --git a/src/adobe/pdfservices/operation/internal/api/dto/response/platform/platform_api_response.py b/src/adobe/pdfservices/operation/internal/api/dto/response/platform/platform_api_response.py new file mode 100644 index 0000000..10defbc --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/dto/response/platform/platform_api_response.py @@ -0,0 +1,39 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +import json + +from adobe.pdfservices.operation.internal.util.json_hint_encoder import JSONHintEncoder, JSONHintDecoder +from adobe.pdfservices.operation.internal.api.dto.response.platform.job_error_response import JobErrorResponse + + +class PlatformApiResponse: + + json_hint = { + 'status': 'status', + 'error': 'error' + } + + def __init__(self, status: int, error: JobErrorResponse): + self.error = error + self.status = status + + def get_error_response(self): + return self.error + + def get_status(self): + return self.status + + def to_json(self): + return json.dumps(self, cls=JSONHintEncoder, indent=4, sort_keys=True) + + @staticmethod + def from_json(json_str): + JSONHintDecoder.current_class = PlatformApiResponse + return JSONHintDecoder.as_class(json.loads(json_str)) diff --git a/src/adobe/pdfservices/operation/internal/api/platform_api.py b/src/adobe/pdfservices/operation/internal/api/platform_api.py new file mode 100644 index 0000000..4ef9b9a --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/platform_api.py @@ -0,0 +1,99 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +import json +import logging +from datetime import datetime +from http import HTTPStatus +import polling2 +from polling2 import TimeoutException +import requests + +from adobe.pdfservices.operation.internal.api.dto.response.job_status import JobStatus +from adobe.pdfservices.operation.internal.constants.request_key import RequestKey +from adobe.pdfservices.operation.internal.http.response_util import ResponseUtil +from adobe.pdfservices.operation.exception.exceptions import ServiceApiException +from adobe.pdfservices.operation.internal.api.dto.response.platform.platform_api_response import PlatformApiResponse +from adobe.pdfservices.operation.internal.exceptions import OperationException +from adobe.pdfservices.operation.internal.extension_media_type_mapping import ExtensionMediaTypeMapping +from adobe.pdfservices.operation.internal.http.http_request import HttpRequest +from adobe.pdfservices.operation.internal.http.http_method import HttpMethod +from adobe.pdfservices.operation.internal.http.request_header_const import DefaultHeaders +from adobe.pdfservices.operation.internal.http import http_client +from adobe.pdfservices.operation.internal.internal_execution_context import InternalExecutionContext +from adobe.pdfservices.operation.internal.api.dto.request.platform.platform_api_request import PlatformApiRequest + + +class PlatformApi: + operation = '/operation/' + POLLING_TIMEOUT_STATUS_CODE = 0 + + @staticmethod + def submit_job(context: InternalExecutionContext, platform_api_request: PlatformApiRequest, operation_endpoint: str, + x_request_id: str, operation_header_info: str): + http_request = HttpRequest(http_method=HttpMethod.POST, + request_key=RequestKey.PLATFORM, + url=context.client_config.get_pdf_services_uri() + PlatformApi.operation + + operation_endpoint, data=platform_api_request.to_json(), + headers={DefaultHeaders.DC_REQUEST_ID_HEADER_KEY: x_request_id, + DefaultHeaders.X_DCSDK_OPS_INFO_HEADER_NAME: operation_header_info, + DefaultHeaders.CONTENT_TYPE_HEADER_NAME: ExtensionMediaTypeMapping.JSON.mime_type}, + + authenticator=context.authenticator, + connect_timeout=context.client_config.get_connect_timeout(), + read_timeout=context.client_config.get_read_timeout()) + response = http_client.process_request(http_request=http_request, + success_status_codes=[HTTPStatus.CREATED], + error_response_handler=PlatformApi.handle_error_response) + return response.headers.get('location') + + @staticmethod + def status_poll(context: InternalExecutionContext, location: str, x_request_id: str): + def is_correct_response(response): + content = json.loads(response.content) + status = content.get('status') + if status == JobStatus.FAILED: + job_error_response = PlatformApiResponse(status, content.get('error')).get_error_response() + raise ServiceApiException(job_error_response.get('message'), ResponseUtil. + get_request_tracking_id_from_response(response, False), job_error_response + .get('status'), job_error_response.get('code')) + return status == JobStatus.DONE + + start_time = datetime.now() + http_request = HttpRequest(http_method=HttpMethod.GET, + request_key=RequestKey.STATUS, + url=location, + headers={DefaultHeaders.DC_REQUEST_ID_HEADER_KEY: x_request_id}, + authenticator=context.authenticator, + connect_timeout=context.client_config.get_connect_timeout(), + read_timeout=context.client_config.get_read_timeout(), + retryable=True) + try: + + response = polling2.poll( + lambda: http_client.process_request(http_request=http_request, + success_status_codes=[HTTPStatus.OK, HTTPStatus.ACCEPTED], + error_response_handler=PlatformApi.handle_error_response), + check_success=is_correct_response, + step=0.5, + timeout=10 * 60 + ) + logging.debug(f'Total polling time, Latency(ms): {(datetime.now() - start_time).microseconds / 1000}') + return response + except TimeoutException: + logging.error("Polling Timeout reached. Something's wrong, file operation took too long") + raise OperationException(message="Operation execution has timed out!", + error_message="Polling Timeout reached", + request_tracking_id=ResponseUtil.get_request_tracking_id_from_response(response, + True) + , status_code=PlatformApi.POLLING_TIMEOUT_STATUS_CODE) + + @staticmethod + def handle_error_response(response: requests.Response): + pass diff --git a/src/adobe/pdfservices/operation/internal/api/storage_api.py b/src/adobe/pdfservices/operation/internal/api/storage_api.py new file mode 100644 index 0000000..6960cb5 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/api/storage_api.py @@ -0,0 +1,107 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. + +import logging +from datetime import datetime +from http import HTTPStatus + +import requests +from adobe.pdfservices.operation.internal.constants.request_key import RequestKey +from adobe.pdfservices.operation.internal.exceptions import OperationException +from adobe.pdfservices.operation.exception.exceptions import ServiceApiException, SdkException +from adobe.pdfservices.operation.io.file_ref import FileRef +from adobe.pdfservices.operation.internal.internal_execution_context import InternalExecutionContext +from adobe.pdfservices.operation.internal.extension_media_type_mapping import ExtensionMediaTypeMapping +from adobe.pdfservices.operation.internal.http.request_header_const import DefaultHeaders +from adobe.pdfservices.operation.internal.http import http_client +from adobe.pdfservices.operation.internal.http.http_method import HttpMethod +from adobe.pdfservices.operation.internal.http.http_request import HttpRequest +from adobe.pdfservices.operation.internal.api.dto.request.asset_upload_uri_request import AssetUploadURIRequest + + +class StorageApi: + + assets = "/assets" + + @staticmethod + def upload_to_cloud(context: InternalExecutionContext, uri: str, source_file_ref: FileRef): + try: + http_request = HttpRequest(http_method=HttpMethod.PUT, + request_key=RequestKey.UPLOAD, + url=uri, + data=source_file_ref.get_as_stream(), + headers={DefaultHeaders.CONTENT_TYPE_HEADER_NAME: source_file_ref.get_media_type( + )}, + connect_timeout=context.client_config.get_connect_timeout(), + read_timeout=context.client_config.get_read_timeout()) + response = http_client.process_request(http_request=http_request, + success_status_codes=[HTTPStatus.ACCEPTED, HTTPStatus.OK], + error_response_handler=StorageApi.handle_error_response) + + logging.debug(f'Asset upload response {response}') + + return response + except FileNotFoundError as fe: + raise fe + except IOError as io: + raise SdkException(f'Unexpected error while uploading file {io}') + + @staticmethod + def get_upload_uri(context: InternalExecutionContext, media_type: str, x_request_id: str): + + try: + assetUploadURIRequest = AssetUploadURIRequest(media_type) + + http_request = HttpRequest(http_method=HttpMethod.POST, + request_key=RequestKey.PLATFORM, + url=context.client_config.get_pdf_services_uri() + StorageApi.assets, + data=assetUploadURIRequest.to_json(), + headers={DefaultHeaders.DC_REQUEST_ID_HEADER_KEY: x_request_id, + DefaultHeaders.CONTENT_TYPE_HEADER_NAME: ExtensionMediaTypeMapping.JSON.mime_type} + , authenticator=context.authenticator, + connect_timeout=context.client_config.get_connect_timeout(), + read_timeout=context.client_config.get_read_timeout()) + + response = http_client.process_request(http_request=http_request, + success_status_codes=[HTTPStatus.ACCEPTED, HTTPStatus.OK], + error_response_handler=StorageApi.handle_error_response) + return response + + except OperationException as oex: + raise ServiceApiException(message=oex.error_message, error_code=oex.error_code, + request_tracking_id=oex.request_tracking_id, status_code=oex.status_code) + + @staticmethod + def handle_error_response(response: requests.Response): + pass + + @staticmethod + def download_and_save_file(context: InternalExecutionContext, uri: str, + destination_path: str): + + start_time = datetime.now() + http_request = HttpRequest(http_method=HttpMethod.GET, + request_key=RequestKey.DOWNLOAD, + headers={}, + url=uri, + connect_timeout=context.client_config.get_connect_timeout(), + read_timeout=context.client_config.get_read_timeout()) + + response = http_client.process_request(http_request=http_request, + success_status_codes=[HTTPStatus.OK, HTTPStatus.ACCEPTED], + error_response_handler=StorageApi.handle_error_response) + logging.debug(f'Upload Operation Latency(ms): {(datetime.now() - start_time).microseconds / 1000}') + + logging.info(f'Downloading file to {destination_path}') + + file = FileRef.create_from_local_file(destination_path) + with open(destination_path, 'wb') as f: + f.write(response.content) + return file diff --git a/src/adobe/pdfservices/operation/internal/auth/jwt_authenticator.py b/src/adobe/pdfservices/operation/internal/auth/jwt_authenticator.py index d455755..8200c6b 100644 --- a/src/adobe/pdfservices/operation/internal/auth/jwt_authenticator.py +++ b/src/adobe/pdfservices/operation/internal/auth/jwt_authenticator.py @@ -17,12 +17,13 @@ import jwt from adobe.pdfservices.operation.auth.service_account_credentials import ServiceAccountCredentials -from adobe.pdfservices.operation.exception.exceptions import SdkException, ServiceApiException +from adobe.pdfservices.operation.exception.exceptions import SdkException from adobe.pdfservices.operation.internal.auth.authenticator import Authenticator from adobe.pdfservices.operation.internal.auth.session_token import SessionToken +from adobe.pdfservices.operation.internal.constants.request_key import RequestKey from adobe.pdfservices.operation.internal.exceptions import OperationException from adobe.pdfservices.operation.internal.http.response_util import ResponseUtil -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants, custom_error_messages +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants, custom_error_messages from adobe.pdfservices.operation.internal.http import http_client from adobe.pdfservices.operation.internal.http.http_method import HttpMethod from adobe.pdfservices.operation.internal.http.http_request import HttpRequest @@ -57,8 +58,8 @@ def refresh_token(self): "client_id": self.service_account_configuration.client_id, "client_secret": self.service_account_configuration.client_secret} try: - http_request = HttpRequest(http_method=HttpMethod.POST, url=url, data=access_token_request_payload, - headers={}) + http_request = HttpRequest(http_method=HttpMethod.POST, request_key=RequestKey.AUTHN, url=url, + data=access_token_request_payload, headers={}) response = http_client.process_request(http_request=http_request, success_status_codes=[HTTPStatus.OK], error_response_handler=self.handle_ims_failure) content = json.loads(response.content) diff --git a/src/adobe/pdfservices/operation/internal/constants/__init__.py b/src/adobe/pdfservices/operation/internal/constants/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adobe/pdfservices/operation/internal/constants/request_key.py b/src/adobe/pdfservices/operation/internal/constants/request_key.py new file mode 100644 index 0000000..43a048d --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/constants/request_key.py @@ -0,0 +1,21 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +import enum + + +class RequestKey(str, enum.Enum): + """ + enum of RequestKeys in the requests + """ + STATUS = "status" + PLATFORM = "platform" + UPLOAD = "upload" + DOWNLOAD = "download" + AUTHN = "ims.session_token" diff --git a/src/adobe/pdfservices/operation/internal/constants/service_constants.py b/src/adobe/pdfservices/operation/internal/constants/service_constants.py new file mode 100644 index 0000000..a50b2a0 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/constants/service_constants.py @@ -0,0 +1,59 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. + +custom_error_messages = { + + # Custom IMS error messages + "imsInvalidTokenGenericErrorMessage": 'Either your certificate for PDF Tools API credentials has expired or an ' + + 'invalid Organization_ID/Account_ID has been used in credentials. Please visit Adobe IO ' + + 'Console(http://console.adobe.io/) to update your public certificate to use the same credentials or to check ' + + 'the value of Organization Id or Account ID.', + "imsCertificateExpiredErrorMessage": 'Your certificate for PDF Tools API credentials might have expired. ' + + 'Please visit Adobe IO Console(http://console.adobe.io/) to update your public certificate to use the same ' + + 'credentials.', + + # Service usage exception error messages + "serviceUsageLimitReachedErrorMessage": 'Service usage limit has been reached. Please retry after sometime.', + "integrationServiceUsageLimitReachedErrorMessage": 'Service usage limit has been reached for the integration. ' + + 'Please retry after sometime.', + + # Quota specific exception error messages + "quotaExhaustedErrorMessage": 'Free trial quota exhausted. Please visit (www.adobe.com/go/pdftoolsapi_err_quota) to ' + + 'upgrade to paid credentials.', + "quotaUnavailableErrorMessage": 'Quota for this operation is not available. Please visit ' + + '(www.adobe.com/go/pdftoolsapi_home) to start using free trial quota.' +} + + +class ServiceConstants: + HTTP_CONNECT_TIMEOUT = 4000 + HTTP_READ_TIMEOUT = 10000 + HTTP_MAX_RETRIES = 1 + HTTP_RETRY_DELAY_FACTOR = 2 + HTTP_MAX_RETRYIN_TERVAL = 15000 + HTTP_RETRY_BACKOFF_INTERVAL = 3000 + HTTP_SUCCESS_RESPONSE_CODE = 200, 201, 202, 204 + HTTP_RETRIABLE_RESPONSE_CODE = 401 + APACHE_CLIENT_MAX_CONNECTION = 200 + APACHE_CLIENT_MAX_CONNECTION_PER_ROUTE = 20 + JWT_BASE_URI = 'https://ims-na1.adobelogin.com' + JWT_URI_SUFFIX = 'ims/exchange/jwt/' + JWT_AUDIENCE_SUFFIX = 'c/' + JWT_CLAIM = 's/ent_documentcloud_sdk' + OPERATION_RESULT_TEMP_DIRECTORY = 'sdkResult' + EXTRACT_OPERATION_ENDPOINT = 'extractpdf' + AUTOTAG_OPERATION_ENDPOINT = 'autotag' + TEXT_MIME_TYPE = "text/directory" + EXTRACT_OPERATION_NAME = "EXTRACT_PDF" + AUTOTAG_OPERATION_NAME = "AUTOTAG_PDF" + CONTENT_ANALYZER_REQUESTS_STRING = "contentAnalyzerRequests" + CONTENT_ANALYZER_RESPONSE_STRING = "contentAnalyzerResponse" + ASSET_UPLOAD_URI_REQUESTS_STRING = "assetUploadURIRequests" + PDF_SERVICES_URI = "https://pdf-services.adobe.io" diff --git a/src/adobe/pdfservices/operation/internal/extension_media_type_mapping.py b/src/adobe/pdfservices/operation/internal/extension_media_type_mapping.py index c16dc10..48945a9 100644 --- a/src/adobe/pdfservices/operation/internal/extension_media_type_mapping.py +++ b/src/adobe/pdfservices/operation/internal/extension_media_type_mapping.py @@ -15,6 +15,7 @@ class ExtensionMediaTypeMapping(str, enum.Enum): PDF = "application/pdf" ZIP = "application/zip" XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + JSON = "application/json" @property def mime_type(self): diff --git a/src/adobe/pdfservices/operation/internal/http/http_client.py b/src/adobe/pdfservices/operation/internal/http/http_client.py index dbc426f..55f9c59 100644 --- a/src/adobe/pdfservices/operation/internal/http/http_client.py +++ b/src/adobe/pdfservices/operation/internal/http/http_client.py @@ -10,19 +10,16 @@ import json import logging import sys -from http import HTTPStatus from typing import Callable, List -import pkg_resources import requests from adobe.pdfservices.operation.exception.exceptions import SdkException -from adobe.pdfservices.operation.internal.exceptions import OperationException from adobe.pdfservices.operation.internal.http.request_header_const import DefaultHeaders -from adobe.pdfservices.operation.internal.http.response_util import ResponseUtil, CPF_STATUS, REPORT, ERROR_CODE, \ - STATUS, TITLE +from adobe.pdfservices.operation.internal.http.response_util import ResponseUtil from adobe.pdfservices.operation.internal.http.http_method import HttpMethod from adobe.pdfservices.operation.internal.http.http_request import HttpRequest +from adobe.pdfservices.operation.internal.exceptions import OperationException _logger = logging.getLogger(__name__) @@ -40,12 +37,12 @@ def process_request(http_request: HttpRequest, success_status_codes: List, while (True): response = _execute_request(http_request) if _handle_response_and_retry(response, success_status_codes, - error_response_handler, not http_request.authenticator) and http_request.retryable: + error_response_handler, not http_request.authenticator, http_request.request_key) and http_request.retryable: _force_authenticate(http_request) # Only single retry is required in case of token expiry http_request.retryable = False else: - if response.status_code not in (200, 202): + if response.status_code not in (200, 201, 202): raise OperationException(message=response.text, status_code=response.status_code, error_code=response.reason, @@ -59,7 +56,7 @@ def _append_default_headers(headers: dict): # Set SDK Info header headers[DefaultHeaders.DC_APP_INFO_HEADER_KEY] = "{lang}-{name}-{version}".format(lang="python", name='pdfservices-sdk', - version='1.0.2b2') + version='2.0.0b1') headers[DefaultHeaders.ACCEPT_HEADER_NAME] = DefaultHeaders.JSON_TXT_CONTENT_TYPE @@ -84,7 +81,11 @@ def _execute_request(http_request: HttpRequest): elif http_request.method == HttpMethod.GET: response = requests.get(url=http_request.url, allow_redirects=True, headers=http_request.headers, timeout=timeout) - except Exception: + elif http_request.method == HttpMethod.PUT: + response = requests.put(url=http_request.url, data=http_request.data, headers=http_request.headers, + timeout=timeout) + + except Exception as e: raise SdkException("Request could not be completed. Possible cause attached!", sys.exc_info()) return response @@ -95,25 +96,9 @@ def _force_authenticate(http_request: HttpRequest): http_request.headers[DefaultHeaders.AUTHORIZATION_HEADER_NAME] = "Bearer " + access_token -def _handle_response_and_retry(response: requests.Response, success_status_codes, error_response_handler, is_ims_api): +def _handle_response_and_retry(response: requests.Response, success_status_codes, error_response_handler, is_ims_api, request_key: str): if response.status_code not in success_status_codes: _logger.debug( "Failure response code {error_code} encountered from backend".format(error_code=response.status_code)) - should_retry = ResponseUtil.handle_api_failures(response, is_ims_api) + should_retry = ResponseUtil.handle_api_failures(response, request_key, is_ims_api) return should_retry if should_retry else error_response_handler(response) - elif response.status_code != HTTPStatus.ACCEPTED and "multipart" not in response.headers["Content-Type"]: - content = json.loads(response.content) - if content.get(CPF_STATUS, None): - cpf_status = content.get(CPF_STATUS, None) - report_error_code = "UNKNOWN" - if cpf_status.get(REPORT, None): - report_error_code = ResponseUtil._get_report_error_code(response_content=content) - if cpf_status.get(STATUS, '') not in success_status_codes: - raise OperationException(message="Error response received for request", - request_tracking_id=ResponseUtil.get_request_tracking_id_from_response(response, - False), - status_code=cpf_status.get(STATUS, ''), - error_message=cpf_status.get(TITLE, ""), - report_error_code=report_error_code) - - diff --git a/src/adobe/pdfservices/operation/internal/http/http_request.py b/src/adobe/pdfservices/operation/internal/http/http_request.py index 056b5ac..c5ff52f 100644 --- a/src/adobe/pdfservices/operation/internal/http/http_request.py +++ b/src/adobe/pdfservices/operation/internal/http/http_request.py @@ -14,9 +14,10 @@ class HttpRequest: # (url, data/files, headers, authenticator (if none its not authenticated), socket_timeout, connect_timeout) - def __init__(self, http_method: HttpMethod, url: str, headers: dict, data=None, files=None, + def __init__(self, http_method: HttpMethod, request_key: str, url: str, headers: dict, data=None, files=None, authenticator: Authenticator = None, read_timeout=None, connect_timeout=None, retryable:bool=False): self.method = http_method + self.request_key = request_key self.url = url self.headers = headers self.data = data diff --git a/src/adobe/pdfservices/operation/internal/http/response_util.py b/src/adobe/pdfservices/operation/internal/http/response_util.py index ce912c8..9198764 100644 --- a/src/adobe/pdfservices/operation/internal/http/response_util.py +++ b/src/adobe/pdfservices/operation/internal/http/response_util.py @@ -9,20 +9,23 @@ # governing permissions and limitations under the License. import json import logging +from xml.etree.ElementTree import fromstring +from xml.sax import SAXParseException import requests -from adobe.pdfservices.operation.exception.exceptions import ServiceUsageException +from adobe.pdfservices.operation.exception.exceptions import ServiceUsageException, ServiceApiException +from adobe.pdfservices.operation.internal.constants.request_key import RequestKey from adobe.pdfservices.operation.internal.exceptions import OperationException -CPF_STATUS="cpf:status" -STATUS="status" -ERROR_CODE="error_code" -TITLE="title" -ERROR="error" -REASON="reason" -REPORT="report" -MESSAGE="message" +CPF_STATUS = "cpf:status" +STATUS = "status" +ERROR_CODE = "error_code" +TITLE = "title" +ERROR = "error" +REASON = "reason" +REPORT = "report" +MESSAGE = "message" class ResponseUtil: _logger = logging.getLogger(__name__) @@ -55,7 +58,7 @@ class ResponseUtil: "(www.adobe.com/go/pdftoolsapi_home) to start using free trial quota or (www.adobe.com/go/pdftoolsapi_err_quota) to upgrade to paid credentials." @staticmethod - def handle_api_failures(response: requests.Response, is_ims_call=False): + def handle_api_failures(response: requests.Response, request_key, is_ims_call=False): # Check if we need a custom error message for this status code custom_error_message = ResponseUtil.CUSTOM_ERROR_MESSAGES_STATUS_CODE_MAPPING.get(response.status_code) if custom_error_message: @@ -65,6 +68,7 @@ def handle_api_failures(response: requests.Response, is_ims_call=False): error_message=custom_error_message.get(MESSAGE), request_tracking_id=ResponseUtil.get_request_tracking_id_from_response(response, is_ims_call)) + ResponseUtil.handle_upload_asset_failure(response, request_key) # Special handling for service usage exception cases if response.status_code == 429: ResponseUtil.handle_service_usage_failure(response) @@ -93,14 +97,29 @@ def handle_service_usage_failure(response): elif ResponseUtil.SERVICE_USAGE_EXCEPTION_STATUS_CODE_429002_STRING == response_content.get(ERROR_CODE, None): response_content[MESSAGE] = ResponseUtil.INTEGRATION_SERVICE_USAGE_LIMIT_REACHED_ERROR_MESSAGE - raise ServiceUsageException(message=response_content.get(MESSAGE, None), + raise ServiceUsageException(message=response_content.get('error').get('message'), request_tracking_id=ResponseUtil.get_request_tracking_id_from_response(response, False), error_code=error_code, status_code=response.status_code) + @staticmethod + def handle_upload_asset_failure(response, request_key): + if request_key == RequestKey.UPLOAD: + try: + response_content = fromstring(response.content) + error_code = response_content.find('Code').text + request_id = response_content.find('RequestId').text + error_message = response_content.find('Message').text + status_code = response.status_code + except SAXParseException: + raise ServiceApiException("Error in uploading file") + raise OperationException(message="Error response received for request", status_code=status_code, + request_tracking_id=request_id,error_message=error_message,error_code=error_code) + @staticmethod def handle_cpf_error_response(response): + response_content = json.loads(response.content) error_code = response_content.get(ERROR_CODE, None) error_message = response_content.get(MESSAGE, None) diff --git a/src/adobe/pdfservices/operation/internal/internal_client_config.py b/src/adobe/pdfservices/operation/internal/internal_client_config.py index 420a1a5..6eb7397 100644 --- a/src/adobe/pdfservices/operation/internal/internal_client_config.py +++ b/src/adobe/pdfservices/operation/internal/internal_client_config.py @@ -9,7 +9,7 @@ # governing permissions and limitations under the License. from adobe.pdfservices.operation.client_config import ClientConfig -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants class InternalClientConfig(ClientConfig): @@ -18,19 +18,15 @@ class InternalClientConfig(ClientConfig): # Setting default values is required for when client config is not provided explicitly. def __init__(self, connect_timeout: int = ServiceConstants.HTTP_CONNECT_TIMEOUT, read_timeout: int = ServiceConstants.HTTP_READ_TIMEOUT, - cpf_ops_create_uri: str = ServiceConstants.CPF_OPS_CREATE_URI, - cpf_extract_analyzer_id: str = ServiceConstants.CPF_OPS_EXTRACT_ANALYZER_ID): + pdf_services_uri: str = ServiceConstants.PDF_SERVICES_URI): + super().__init__() self._connect_timeout = connect_timeout self._read_timeout = read_timeout - self._cpf_ops_create_uri = cpf_ops_create_uri - self._cpf_extract_analyzer_id = cpf_extract_analyzer_id - - def get_cpf_ops_create_uri(self): - return self._cpf_ops_create_uri + self._pdf_services_uri = pdf_services_uri - def get_cpf_extract_service_id(self): - return self._cpf_extract_analyzer_id + def get_pdf_services_uri(self): + return self._pdf_services_uri def get_cpf_autotag_service_id(self): return ServiceConstants.CPF_OPS_AUTOTAG_ANALYZER_ID diff --git a/src/adobe/pdfservices/operation/internal/internal_execution_context.py b/src/adobe/pdfservices/operation/internal/internal_execution_context.py index c5fcb75..97f22e0 100644 --- a/src/adobe/pdfservices/operation/internal/internal_execution_context.py +++ b/src/adobe/pdfservices/operation/internal/internal_execution_context.py @@ -10,10 +10,8 @@ from adobe.pdfservices.operation.auth.service_account_credentials import ServiceAccountCredentials from adobe.pdfservices.operation.execution_context import ExecutionContext -from adobe.pdfservices.operation.internal.http.request_header_const import DefaultHeaders from adobe.pdfservices.operation.internal.auth.auth_factory import AuthenticatorFactory -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants from adobe.pdfservices.operation.internal.internal_client_config import InternalClientConfig diff --git a/src/adobe/pdfservices/operation/internal/io/file_ref_impl.py b/src/adobe/pdfservices/operation/internal/io/file_ref_impl.py index 383e838..8ff58ac 100644 --- a/src/adobe/pdfservices/operation/internal/io/file_ref_impl.py +++ b/src/adobe/pdfservices/operation/internal/io/file_ref_impl.py @@ -14,7 +14,7 @@ from io import BufferedWriter from adobe.pdfservices.operation.exception.exceptions import SdkException -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants from adobe.pdfservices.operation.internal.extension_media_type_mapping import ExtensionMediaTypeMapping from adobe.pdfservices.operation.internal.util.path_util import get_extension from adobe.pdfservices.operation.io.file_ref import FileRef @@ -27,7 +27,10 @@ def get_media_type(self): def get_as_stream(self): if self._file_path: - return open(self._file_path, 'rb') + file = open(self._file_path, 'rb') + file_content = file.read() + file.close() + return file_content else: file_stream = self._input_stream return file_stream diff --git a/src/adobe/pdfservices/operation/internal/response/asset_upload_uri_response.py b/src/adobe/pdfservices/operation/internal/response/asset_upload_uri_response.py new file mode 100644 index 0000000..d0708ee --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/response/asset_upload_uri_response.py @@ -0,0 +1,28 @@ +# Copyright 2022 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. +class AssetUploadURIResponse: + json_hint = { + 'uploadUri': 'uploadUri', + 'assetID': 'assetID' + } + + def __init__(self, upload_uri: str, + asset_id: str): + super().__init__() + self._upload_uri = upload_uri + self._asset_iD = asset_id + + @property + def upload_uri(self): + return self._upload_uri + + @property + def asset_id(self): + return self._asset_id diff --git a/src/adobe/pdfservices/operation/internal/service/autotag_pdf_service.py b/src/adobe/pdfservices/operation/internal/service/autotag_pdf_service.py new file mode 100644 index 0000000..98ede69 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/service/autotag_pdf_service.py @@ -0,0 +1,51 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. + +import json + +from adobe.pdfservices.operation.io.file_ref import FileRef +from adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options import AutotagPDFOptions +from adobe.pdfservices.operation.internal.internal_execution_context import InternalExecutionContext +from adobe.pdfservices.operation.internal.api.platform_api import PlatformApi +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants +from adobe.pdfservices.operation.internal.api.storage_api import StorageApi +from adobe.pdfservices.operation.internal.api.dto.request.autotagpdf.autotag_pdf_request import AutotagPDFRequest + + +class AutotagPDFService: + + @staticmethod + def autotag_pdf(context: InternalExecutionContext, source_file_ref: FileRef, autotag_pdf_options: AutotagPDFOptions, + x_request_id: str): + + try: + get_upload_uri_response = StorageApi.get_upload_uri(context, source_file_ref.get_media_type(), x_request_id) + + content = json.loads(get_upload_uri_response.content) + asset_id = content.get('assetID') + StorageApi.upload_to_cloud(context, content.get('uploadUri'), source_file_ref) + autotag_pdf_request = AutotagPDFRequest.from_autotag_pdf_options(asset_id, autotag_pdf_options) + location = PlatformApi.submit_job(context, autotag_pdf_request, ServiceConstants.AUTOTAG_OPERATION_ENDPOINT, + x_request_id, ServiceConstants.AUTOTAG_OPERATION_NAME) + status_poll_response = PlatformApi.status_poll(context, location, x_request_id) + + download_uri_list = [] + taggedpdf_download_uri = json.loads(status_poll_response.content).get('tagged-pdf').get('downloadUri') + download_uri_list.append(taggedpdf_download_uri) + + if autotag_pdf_options is not None and autotag_pdf_options.generate_report == True: + report_download_uri = json.loads(status_poll_response.content).get('report').get('downloadUri') + download_uri_list.append(report_download_uri) + + return download_uri_list + except FileNotFoundError as fe: + raise fe + except Exception as e: + raise e diff --git a/src/adobe/pdfservices/operation/internal/service/extract_pdf_service.py b/src/adobe/pdfservices/operation/internal/service/extract_pdf_service.py new file mode 100644 index 0000000..5bc75e4 --- /dev/null +++ b/src/adobe/pdfservices/operation/internal/service/extract_pdf_service.py @@ -0,0 +1,44 @@ +# Copyright 2021 Adobe. All rights reserved. +# This file is licensed to you under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. You may obtain a copy +# of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under +# the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS +# OF ANY KIND, either express or implied. See the License for the specific language +# governing permissions and limitations under the License. + +import json + +from adobe.pdfservices.operation.io.file_ref import FileRef +from adobe.pdfservices.operation.pdfops.options.extractpdf.extract_pdf_options import ExtractPDFOptions +from adobe.pdfservices.operation.internal.internal_execution_context import InternalExecutionContext +from adobe.pdfservices.operation.internal.api.platform_api import PlatformApi +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants +from adobe.pdfservices.operation.internal.api.dto.request.extract_pdf_request import ExtractPDFRequest +from adobe.pdfservices.operation.internal.api.storage_api import StorageApi + + +class ExtractPDFService: + + @staticmethod + def extract_pdf(context: InternalExecutionContext, source_file_ref: FileRef, extract_pdf_options: ExtractPDFOptions, + x_request_id: str): + + try: + get_upload_uri_response = StorageApi.get_upload_uri(context, source_file_ref.get_media_type(), x_request_id) + + content = json.loads(get_upload_uri_response.content) + asset_id = content.get('assetID') + StorageApi.upload_to_cloud(context, content.get('uploadUri'), source_file_ref) + extract_pdf_request = ExtractPDFRequest.from_extract_pdf_options(asset_id, extract_pdf_options) + location = PlatformApi.submit_job(context, extract_pdf_request, ServiceConstants.EXTRACT_OPERATION_ENDPOINT, + x_request_id, ServiceConstants.EXTRACT_OPERATION_NAME) + + status_poll_response = PlatformApi.status_poll(context, location, x_request_id) + download_uri = json.loads(status_poll_response.content).get('resource').get('downloadUri') + return download_uri + except FileNotFoundError as fe: + raise fe + except Exception as e: + raise e diff --git a/src/adobe/pdfservices/operation/internal/util/file_utils.py b/src/adobe/pdfservices/operation/internal/util/file_utils.py index c510a62..709a498 100644 --- a/src/adobe/pdfservices/operation/internal/util/file_utils.py +++ b/src/adobe/pdfservices/operation/internal/util/file_utils.py @@ -8,12 +8,6 @@ # OF ANY KIND, either express or implied. See the License for the specific language # governing permissions and limitations under the License. -import os -import tempfile -import uuid -from typing import Optional - -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants from adobe.pdfservices.operation.internal.util.path_util import get_file_path diff --git a/src/adobe/pdfservices/operation/internal/util/path_util.py b/src/adobe/pdfservices/operation/internal/util/path_util.py index c5356a9..54909d2 100644 --- a/src/adobe/pdfservices/operation/internal/util/path_util.py +++ b/src/adobe/pdfservices/operation/internal/util/path_util.py @@ -12,7 +12,7 @@ import uuid from typing import Optional -from adobe.pdfservices.operation.internal.service_constants import ServiceConstants +from adobe.pdfservices.operation.internal.constants.service_constants import ServiceConstants def get_extension(file_path): diff --git a/src/adobe/pdfservices/operation/io/file_ref.py b/src/adobe/pdfservices/operation/io/file_ref.py index d68155f..61a8194 100644 --- a/src/adobe/pdfservices/operation/io/file_ref.py +++ b/src/adobe/pdfservices/operation/io/file_ref.py @@ -66,4 +66,11 @@ def save_as(self, local_file_path: str): @abstractmethod def write_to_stream(self, writer_stream): - pass \ No newline at end of file + pass + + def get_media_type(self): + """ + returns the media type + """ + return self._media_type + diff --git a/src/adobe/pdfservices/operation/pdfops/autotag_pdf_operation.py b/src/adobe/pdfservices/operation/pdfops/autotag_pdf_operation.py index 5de12e2..5ef7c9a 100644 --- a/src/adobe/pdfservices/operation/pdfops/autotag_pdf_operation.py +++ b/src/adobe/pdfservices/operation/pdfops/autotag_pdf_operation.py @@ -9,6 +9,7 @@ # governing permissions and limitations under the License. import logging +import uuid from adobe.pdfservices.operation.exception.exceptions import ServiceApiException from adobe.pdfservices.operation.execution_context import ExecutionContext @@ -17,13 +18,14 @@ from adobe.pdfservices.operation.internal.exceptions import OperationException from adobe.pdfservices.operation.internal.extension_media_type_mapping import ExtensionMediaTypeMapping from adobe.pdfservices.operation.internal.internal_execution_context import InternalExecutionContext -from adobe.pdfservices.operation.internal.service.autotagpdf.autotag_pdf_api import AutotagPDFAPI +from adobe.pdfservices.operation.internal.api.storage_api import StorageApi from adobe.pdfservices.operation.internal.util.file_utils import get_transaction_id from adobe.pdfservices.operation.internal.util.path_util import get_temporary_destination_path from adobe.pdfservices.operation.internal.util.validation_util import validate_media_type from adobe.pdfservices.operation.io.file_ref import FileRef from adobe.pdfservices.operation.operation import Operation from adobe.pdfservices.operation.pdfops.options.autotagpdf.autotag_pdf_options import AutotagPDFOptions +from adobe.pdfservices.operation.internal.service.autotag_pdf_service import AutotagPDFService class AutotagPDFOperation(Operation): @@ -108,6 +110,14 @@ def set_options(self, autotag_pdf_options: AutotagPDFOptions): self._autotag_pdf_options = autotag_pdf_options return self + def get_options(self): + """gets the AutotagPDFOptions. + + :return: The options parameter of the operation + :rtype: AutotagPDFOptions + """ + return self._autotag_pdf_options + def set_input(self, source_file_ref: FileRef): """ Sets an input file. @@ -139,21 +149,32 @@ def execute(self, execution_context: ExecutionContext): self._validate(execution_context=execution_context) self._logger.info("All validations successfully done. Beginning AutotagPDF operation execution") - location = AutotagPDFAPI.autotag_pdf(execution_context, self._source_file_ref, self._autotag_pdf_options) + x_request_id = str(uuid.uuid1()) + download_uri_list = AutotagPDFService.autotag_pdf(execution_context, self._source_file_ref, self.get_options(), + x_request_id) self._is_invoked = True - file_location_pdf = get_temporary_destination_path(target_extension=ExtensionMediaTypeMapping.PDF.extension) - file_location_xlsx = get_temporary_destination_path( + temporary_tagged_pdf_destination_path = get_temporary_destination_path(target_extension=ExtensionMediaTypeMapping.PDF.extension) + temporary_report_destination_path = get_temporary_destination_path( target_extension=ExtensionMediaTypeMapping.XLSX.extension) - autotag_pdf_output_files: AutotagPDFOutputFiles = AutotagPDFAPI.download_and_save(location=location, - context=execution_context, - file_location_pdf=file_location_pdf, - file_location_xlsx=file_location_xlsx) - self._logger.info("Autotag Operation Successful - Transaction ID: %s", get_transaction_id(location)) + StorageApi.download_and_save_file(execution_context, download_uri_list[0], + temporary_tagged_pdf_destination_path) + + autotag_pdf_output_files = AutotagPDFOutputFiles() + autotag_pdf_output_files.pdf_file = FileRef.create_from_local_file(temporary_tagged_pdf_destination_path) + + if self.get_options() is not None and self.get_options().generate_report == True: + StorageApi.download_and_save_file(execution_context, download_uri_list[1], + temporary_report_destination_path) + autotag_pdf_output_files.xls_file = FileRef.create_from_local_file(temporary_report_destination_path) + + self._logger.info("Autotag Operation Successful - Request ID: %s", x_request_id) return autotag_pdf_output_files - except OperationException as oex: - raise ServiceApiException(message=oex.error_message, error_code=oex.error_code, - request_tracking_id=oex.request_tracking_id, - status_code=oex.status_code) from None + + except ServiceApiException as se: + raise se + + except Exception as ex: + raise ex def _validate_invocation_count(self): if self._is_invoked: diff --git a/src/adobe/pdfservices/operation/pdfops/extract_pdf_operation.py b/src/adobe/pdfservices/operation/pdfops/extract_pdf_operation.py index 6fcf5d8..11e23ef 100644 --- a/src/adobe/pdfservices/operation/pdfops/extract_pdf_operation.py +++ b/src/adobe/pdfservices/operation/pdfops/extract_pdf_operation.py @@ -9,15 +9,14 @@ # governing permissions and limitations under the License. import logging -from typing import List +import uuid from adobe.pdfservices.operation.exception.exceptions import ServiceApiException from adobe.pdfservices.operation.execution_context import ExecutionContext -from adobe.pdfservices.operation.internal.api.cpf_api import CPFApi -from adobe.pdfservices.operation.internal.exceptions import OperationException +from adobe.pdfservices.operation.internal.api.storage_api import StorageApi from adobe.pdfservices.operation.internal.extension_media_type_mapping import ExtensionMediaTypeMapping from adobe.pdfservices.operation.internal.internal_execution_context import InternalExecutionContext -from adobe.pdfservices.operation.internal.service.extract_pdf_api import ExtractPDFAPI +from adobe.pdfservices.operation.internal.service.extract_pdf_service import ExtractPDFService from adobe.pdfservices.operation.internal.util.file_utils import get_transaction_id from adobe.pdfservices.operation.internal.util.path_util import get_temporary_destination_path from adobe.pdfservices.operation.internal.util.validation_util import validate_media_type @@ -85,6 +84,14 @@ def create_new(cls): """ return ExtractPDFOperation(cls.__create_key) + def get_options(self): + """gets the ExtractPDFOptions. + + :return: The options parameter of the operation + :rtype: ExtractPDFOptions + """ + return self._extract_pdf_options + def set_options(self, extract_pdf_options: ExtractPDFOptions): """ sets the ExtractPDFOptions. @@ -128,15 +135,23 @@ def execute(self, execution_context: ExecutionContext): self._validate(execution_context=execution_context) self._logger.info("All validations successfully done. Beginning ExtractPDF operation execution") - location = ExtractPDFAPI.extract_pdf(execution_context, self._source_file_ref, self._extract_pdf_options) - self._is_invoked = True + x_request_id = str(uuid.uuid4()) + download_uri = ExtractPDFService.extract_pdf(execution_context, self._source_file_ref, self.get_options(), + x_request_id) + file_location = get_temporary_destination_path(target_extension=ExtensionMediaTypeMapping.ZIP.extension) - ExtractPDFAPI.download_and_save(location=location, context=execution_context, file_location=file_location) - self._logger.info("Extract Operation Successful - Transaction ID: %s", get_transaction_id(location)) - return FileRef.create_from_local_file(file_location) - except OperationException as oex: - raise ServiceApiException(message=oex.error_message, error_code=oex.error_code, - request_tracking_id=oex.request_tracking_id, status_code=oex.status_code) from None + + file = StorageApi.download_and_save_file(execution_context, download_uri, file_location) + + self._logger.info(f'Extract Operation Successful - Transaction ID: {get_transaction_id(x_request_id)}') + + return file + + except ServiceApiException as se: + raise se + + except Exception as ex: + raise ex def _validate_invocation_count(self): if self._is_invoked: