@markpdf/react-native does not depend on any native modules of its own — it uses global fetch/FormData/XMLHttpRequest, available in both. The difference is in which picker you use to get the uri/name of the file.
On Android, check that your targetSdkVersion is compatible with the version of react-native-document-picker you install — recent versions of Android Scoped Storage change how content:// URIs are resolved. Follow the package installation guide for your version of RN.
Neither expo-document-picker nor react-native-document-picker require explicit storage permissions in most cases — both delegate to the system’s native file picker (Document Picker on iOS, Storage Access Framework on Android), which does not need READ_EXTERNAL_STORAGE. If your app also needs to access the photo gallery to attach scanned images, use expo-image-picker (Expo) or react-native-image-picker (bare) and follow their separate permission requirements — that’s separate from @markpdf/react-native.
Unlike a web app, a mobile app binary does not have a “server” that serves environment variables at runtime — any string embedded in the JS bundle is removable by someone with the .ipa/.apk. Options, from most to least safe:
Proxy on your backend (recommended for production): the app calls your own endpoint, which in turn calls markpdf with the key saved server-side. The app never sees the markpdf key.
Embedded low privilege key: if you do not have your own backend, use a key dedicated only to that app, with limited usage and billing limits, assuming it can be leaked.
Build environment variables (EAS Secrets in Expo, .env + react-native-config in bare): they prevent hardcoding the key in the versioned source code, but they do not prevent it from ending up in the final decompilable bundle. Useful to not commit the key to the repo, not to hide it from the end user.
// Expo: read at build time from EAS Secrets/app.config.ts -> extraimport Constants from "expo-constants";const client = new MarkpdfClient({ apiKey: Constants.expoConfig?.extra?.markpdfApiKey });
If your app handles sensitive documents from real users, use option 1 (proxy in your backend). A key embedded in the binary, even if it is not in the repo, is still removable with standard decompilation tools.
Uploading large PDFs from the picker may take time; If the user minimizes the app during upload, iOS/Android may suspend the network task depending on the operating system and the state of the app. For long, reliable background uploads, consider a background upload library (e.g. react-native-background-upload) rather than relying on fetch/XMLHttpRequest to survive indefinitely with the app in the background — this is a general RN limitation, not specific to @markpdf/react-native.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Markpdf","colors":{"primary":"#0f766e","light":"#14b8a6","dark":"#042f2e"},"logo":{"light":"https://mintcdn.com/markpdf/hAfZoDv7tbjC8_rz/images/logo.png?fit=max\u0026auto=format\u0026n=hAfZoDv7tbjC8_rz\u0026q=85\u0026s=fa730c88f33ff59494a575c8af226979","dark":"https://mintcdn.com/markpdf/hAfZoDv7tbjC8_rz/images/logo.png?fit=max\u0026auto=format\u0026n=hAfZoDv7tbjC8_rz\u0026q=85\u0026s=fa730c88f33ff59494a575c8af226979","href":"https://markpdf.tech/"},"favicon":{"light":"https://mintcdn.com/markpdf/hAfZoDv7tbjC8_rz/images/favicon.png?fit=max\u0026auto=format\u0026n=hAfZoDv7tbjC8_rz\u0026q=85\u0026s=d5e294dc15ed758692c9501385e38191","dark":"https://mintcdn.com/markpdf/hAfZoDv7tbjC8_rz/images/favicon.png?fit=max\u0026auto=format\u0026n=hAfZoDv7tbjC8_rz\u0026q=85\u0026s=d5e294dc15ed758692c9501385e38191"},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","default":true,"href":"docs/public/introduction"},{"language":"es","href":"docs/public/es/introduction"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"markpdf","hasAudioNarration":false,"actualSubdomain":"markpdf","customDomains":["docs.markpdf.tech"],"gitSource":{"type":"github","owner":"mounirb-dev","repo":"pdf-to-markdown-api","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"24dff579-b2b3-45b7-996f-bdc79e8b5a09","liveDeploymentHistoryId":"6a52afa43e2c335ddfb43296","schemaVersion":"v3"},"feedback":{"thumbs":false},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a60a9a198f5094b9414ffe4:success","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"en","tag":"SDKs","count":77},{"language":"es","tag":"SDKs","count":77},{"language":"en","tag":"Integrations","count":22},{"language":"es","tag":"Integraciones","count":22},{"language":"en","tag":"Home","count":11},{"language":"es","tag":"Inicio","count":11},{"language":"en","tag":"Frameworks","count":10},{"language":"es","tag":"Frameworks","count":10},{"language":"en","tag":"API","count":9},{"language":"en","tag":"Reference","count":9},{"language":"en","tag":"Languages","count":9},{"language":"es","tag":"API","count":9},{"language":"es","tag":"Referencia","count":9},{"language":"es","tag":"Lenguajes","count":9},{"language":"en","tag":"Concepts","count":7},{"language":"en","tag":"Angular","count":7},{"language":"en","tag":"Next.js","count":7},{"language":"es","tag":"Conceptos","count":7},{"language":"es","tag":"Angular","count":7},{"language":"es","tag":"Next.js","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"docs/public/sdks/react-native/framework-guide","slug":"/docs/public/sdks/react-native/framework-guide","pageMetadata":{"title":"Framework guide","description":"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.","href":"/docs/public/sdks/react-native/framework-guide"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`framework-guide`,children:`Framework guide`}),`\n`,_jsx(Heading,{level:`2`,id:`expo-vs-bare-react-native`,children:`Expo vs bare React Native`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`@markpdf/react-native`}),` does not depend on any native modules of its own — it uses global `,_jsx(_components.code,{children:`fetch`}),`/`,_jsx(_components.code,{children:`FormData`}),`/`,_jsx(_components.code,{children:`XMLHttpRequest`}),`, available in both. The difference is in which picker you use to get the `,_jsx(_components.code,{children:`uri`}),`/`,_jsx(_components.code,{children:`name`}),` of the file.`]}),`\n`,_jsxs(Heading,{level:`3`,id:`expo-expo-document-picker`,children:[`Expo: `,_jsx(_components.code,{children:`expo-document-picker`})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` expo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` expo-document-picker`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`tsx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`tsx`,children:_jsxs(_components.code,{language:`tsx`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` *`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` DocumentPicker`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"expo-document-picker\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` result`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` DocumentPicker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getDocumentAsync`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"application/pdf\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`result`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`canceled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` asset`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` result`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`assets`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]; `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// { uri, name, mimeType, size }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Does not require additional permissions on `,_jsx(_components.code,{children:`app.json`}),` — the operating system’s file chooser handles access.`]}),`\n`,_jsxs(Heading,{level:`3`,id:`bare-rn-react-native-document-picker`,children:[`Bare RN: `,_jsx(_components.code,{children:`react-native-document-picker`})]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npm`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` react-native-document-picker`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`cd`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ios`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`pod`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`tsx`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`tsx`,children:_jsxs(_components.code,{language:`tsx`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` DocumentPicker`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"react-native-document-picker\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`file`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` DocumentPicker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`pick`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`DocumentPicker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`types`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`pdf`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] });`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// { uri, name, type, size }`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`On Android, check that your `,_jsx(_components.code,{children:`targetSdkVersion`}),` is compatible with the version of `,_jsx(_components.code,{children:`react-native-document-picker`}),` you install — recent versions of Android Scoped Storage change how `,_jsx(_components.code,{children:`content://`}),` URIs are resolved. Follow the package installation guide for your version of RN.`]}),`\n`,_jsx(Heading,{level:`2`,id:`permisos`,children:`Permisos`}),`\n`,_jsxs(_components.p,{children:[`Neither `,_jsx(_components.code,{children:`expo-document-picker`}),` nor `,_jsx(_components.code,{children:`react-native-document-picker`}),` require explicit storage permissions in most cases — both delegate to the system’s native file picker (Document Picker on iOS, Storage Access Framework on Android), which does not need `,_jsx(_components.code,{children:`READ_EXTERNAL_STORAGE`}),`. If your app also needs to access the photo gallery to attach scanned images, use `,_jsx(_components.code,{children:`expo-image-picker`}),` (Expo) or `,_jsx(_components.code,{children:`react-native-image-picker`}),` (bare) and follow their separate permission requirements — that’s separate from `,_jsx(_components.code,{children:`@markpdf/react-native`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`where-does-the-api-key-live`,children:`Where does the API key live?`}),`\n`,_jsxs(_components.p,{children:[`Unlike a web app, a mobile app binary does not have a “server” that serves environment variables at runtime — any string embedded in the JS bundle is removable by someone with the `,_jsx(_components.code,{children:`.ipa`}),`/`,_jsx(_components.code,{children:`.apk`}),`. Options, from most to least safe:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Proxy on your backend`}),` (recommended for production): the app calls your own endpoint, which in turn calls markpdf with the key saved server-side. The app never sees the markpdf key.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Embedded low privilege key`}),`: if you do not have your own backend, use a key dedicated only to that app, with limited usage and billing limits, assuming it can be leaked.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Build environment variables`}),` (`,_jsx(_components.code,{children:`EAS Secrets`}),` in Expo, `,_jsx(_components.code,{children:`.env`}),` + `,_jsx(_components.code,{children:`react-native-config`}),` in bare): they prevent hardcoding the key in the versioned source code, but they `,_jsx(_components.strong,{children:`do not`}),` prevent it from ending up in the final decompilable bundle. Useful to not commit the key to the repo, not to hide it from the end user.`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Expo: read at build time from EAS Secrets/app.config.ts -> extra`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Constants`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"expo-constants\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` client`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` MarkpdfClient`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`apiKey:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Constants`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`expoConfig`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`?.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`extra`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`?.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`markpdfApiKey`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`If your app handles sensitive documents from real users, use option 1 (proxy in your backend). A key embedded in the binary, even if it is not in the repo, is still removable with standard decompilation tools.`})}),`\n`,_jsx(Heading,{level:`2`,id:`networking-en-segundo-plano`,children:`Networking en segundo plano`}),`\n`,_jsxs(_components.p,{children:[`Uploading large PDFs from the picker may take time; If the user minimizes the app during upload, iOS/Android may suspend the network task depending on the operating system and the state of the app. For long, reliable background uploads, consider a background upload library (e.g. `,_jsx(_components.code,{children:`react-native-background-upload`}),`) rather than relying on `,_jsx(_components.code,{children:`fetch`}),`/`,_jsx(_components.code,{children:`XMLHttpRequest`}),` to survive indefinitely with the app in the background — this is a general RN limitation, not specific to `,_jsx(_components.code,{children:`@markpdf/react-native`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Framework guide","description":"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.","href":"/docs/public/sdks/react-native/framework-guide"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Framework guide","slug":"framework-guide","depth":1,"children":[]},{"title":"Expo vs bare React Native","slug":"expo-vs-bare-react-native","depth":2,"children":[{"title":"Expo: expo-document-picker","slug":"expo-expo-document-picker","depth":3,"children":[]},{"title":"Bare RN: react-native-document-picker","slug":"bare-rn-react-native-document-picker","depth":3,"children":[]}]},{"title":"Permisos","slug":"permisos","depth":2,"children":[]},{"title":"Where does the API key live?","slug":"where-does-the-api-key-live","depth":2,"children":[]},{"title":"Networking en segundo plano","slug":"networking-en-segundo-plano","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/markpdf/b693ed12839cd1cf/clients/markdownCache.js","/_mintlify/custom/markpdf/3d49fc9bf540e0bd/src/index.js","/_mintlify/custom/markpdf/a8469ea09dc3f874/tests/burst_test.js","/_mintlify/custom/markpdf/10a22c9458ef8f9a/tests/worker/index.test.js"],"subdomain":"markpdf","siteName":"Markpdf","title":"Framework guide - Markpdf","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/docs/public/sdks/react-native/framework-guide","matchLevel":0},"es":{"href":"/docs/public/es/sdks/react-native/framework-guide","matchLevel":1}}},"lastModified":"2026-07-10T14:33:23.326Z","originalFileLocation":"docs/public/sdks/react-native/framework-guide.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Markpdf\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Framework guide - Markpdf\">\u003cmeta data-mint-head property=\"og:description\" content=\"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Markpdf\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://markpdf.mintlify.app/_mintlify/api/og/v2?division=React+Native\u0026amp;title=Framework+guide\u0026amp;description=Storage%2Fpicker+permissions%2C+Expo+vs+bare+RN+differences%2C+and+where+to+save+the+API+key.\u0026amp;theme=c71f31d357bbb460bcaddd6d\u0026amp;signature=05ca6211c688bfb7b226cea46b547315a12d08f7c081b54c94a9b669c748273b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Framework guide - Markpdf\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://markpdf.mintlify.app/_mintlify/api/og/v2?division=React+Native\u0026amp;title=Framework+guide\u0026amp;description=Storage%2Fpicker+permissions%2C+Expo+vs+bare+RN+differences%2C+and+where+to+save+the+API+key.\u0026amp;theme=c71f31d357bbb460bcaddd6d\u0026amp;signature=05ca6211c688bfb7b226cea46b547315a12d08f7c081b54c94a9b669c748273b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/markpdf/x5FHiYMZvs-b_9bj/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Markpdf\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0f766e\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/public/sdks/react-native/framework-guide.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.markpdf.tech/#organization\",\"name\":\"Markpdf\",\"url\":\"https://docs.markpdf.tech\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/markpdf/hAfZoDv7tbjC8_rz/images/logo.png?fit=max\u0026auto=format\u0026n=hAfZoDv7tbjC8_rz\u0026q=85\u0026s=fa730c88f33ff59494a575c8af226979\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.markpdf.tech#website\",\"name\":\"Markpdf\",\"url\":\"https://docs.markpdf.tech\",\"publisher\":{\"@id\":\"https://docs.markpdf.tech/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide#webpage\",\"url\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide\",\"name\":\"Framework guide\",\"description\":\"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.\",\"dateModified\":\"2026-07-10T14:33:23.326Z\",\"isPartOf\":{\"@id\":\"https://docs.markpdf.tech#website\"},\"breadcrumb\":{\"@id\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"React Native\",\"item\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/installation\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Framework guide\",\"item\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide#article\",\"headline\":\"Framework guide\",\"name\":\"Framework guide\",\"description\":\"Storage/picker permissions, Expo vs bare RN differences, and where to save the API key.\",\"url\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide\",\"mainEntityOfPage\":{\"@id\":\"https://docs.markpdf.tech/docs/public/sdks/react-native/framework-guide#webpage\"},\"dateModified\":\"2026-07-10T14:33:23.326Z\",\"publisher\":{\"@id\":\"https://docs.markpdf.tech/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.markpdf.tech#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Markpdf\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Markpdf","nav":{"global":null,"languages":[{"language":"en","default":true,"tabs":[{"tab":"Home","pages":[{"title":"Home","href":"/docs/public/introduction"}]},{"tab":"API","pages":[{"title":"API","href":"/docs/public/api/overview"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/docs/public/integrations/javascript"}]},{"tab":"SDKs","groups":[{"group":"Python","pages":[{"title":"Installation","href":"/docs/public/sdks/python/installation"},{"title":"Quickstart","href":"/docs/public/sdks/python/quickstart"},{"title":"Referencia","href":"/docs/public/sdks/python/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/python/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/python/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/python/examples"}]},{"group":"Node.js / TypeScript","pages":[{"title":"Installation","href":"/docs/public/sdks/nodejs/installation"},{"title":"Quickstart","href":"/docs/public/sdks/nodejs/quickstart"},{"title":"Referencia","href":"/docs/public/sdks/nodejs/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/nodejs/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/nodejs/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/nodejs/examples"}]},{"group":"C++","pages":[{"title":"Installation","href":"/docs/public/sdks/cpp/installation"},{"title":"Quickstart","href":"/docs/public/sdks/cpp/quickstart"},{"title":"Referencia","href":"/docs/public/sdks/cpp/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/cpp/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/cpp/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/cpp/examples"}]},{"group":"Next.js","pages":[{"title":"Installation","href":"/docs/public/sdks/nextjs/installation"},{"title":"Quickstart","href":"/docs/public/sdks/nextjs/quickstart"},{"title":"Framework Guide: App Router","href":"/docs/public/sdks/nextjs/framework-guide"},{"title":"Referencia","href":"/docs/public/sdks/nextjs/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/nextjs/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/nextjs/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/nextjs/examples"}]},{"group":"Angular","pages":[{"title":"Installation","href":"/docs/public/sdks/angular/installation"},{"title":"Quickstart","href":"/docs/public/sdks/angular/quickstart"},{"title":"Framework guide: protect the API key","href":"/docs/public/sdks/angular/framework-guide"},{"title":"Referencia","href":"/docs/public/sdks/angular/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/angular/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/angular/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/angular/examples"}]},{"group":"React","pages":[{"title":"Installation","href":"/docs/public/sdks/react/installation"},{"title":"Quickstart","href":"/docs/public/sdks/react/quickstart"},{"title":"Framework guide","href":"/docs/public/sdks/react/framework-guide"},{"title":"Referencia","href":"/docs/public/sdks/react/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/react/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/react/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/react/examples"}]},{"group":"React Native","pages":[{"title":"Installation","href":"/docs/public/sdks/react-native/installation"},{"title":"Quickstart","description":"Select a PDF with expo-document-picker and convert it to less than 20 lines.","href":"/docs/public/sdks/react-native/quickstart"},{"title":"Framework guide","href":"/docs/public/sdks/react-native/framework-guide"},{"title":"Referencia","description":"MarkpdfClient class, useConvertFile hook and @markpdf/react-native types.","href":"/docs/public/sdks/react-native/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/react-native/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/react-native/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/react-native/examples"}]},{"group":"Svelte","pages":[{"title":"Installation","href":"/docs/public/sdks/svelte/installation"},{"title":"Quickstart","href":"/docs/public/sdks/svelte/quickstart"},{"title":"Framework Guide: SvelteKit","href":"/docs/public/sdks/svelte/framework-guide"},{"title":"Referencia","href":"/docs/public/sdks/svelte/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/svelte/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/svelte/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/svelte/examples"}]},{"group":"Bun","pages":[{"title":"Installation","href":"/docs/public/sdks/bun/installation"},{"title":"Quickstart","href":"/docs/public/sdks/bun/quickstart"},{"title":"Referencia","href":"/docs/public/sdks/bun/reference"},{"title":"Streaming and asynchronous jobs","href":"/docs/public/sdks/bun/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/bun/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/bun/examples"}]},{"group":"Flutter","pages":[{"title":"Installation","href":"/docs/public/sdks/flutter/installation"},{"title":"Quickstart","href":"/docs/public/sdks/flutter/quickstart"},{"title":"Referencia","href":"/docs/public/sdks/flutter/reference"},{"title":"Asynchronous jobs","href":"/docs/public/sdks/flutter/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/flutter/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/flutter/examples"}]},{"group":"Java","pages":[{"title":"Installation","href":"/docs/public/sdks/java/installation"},{"title":"Quickstart","href":"/docs/public/sdks/java/quickstart"},{"title":"Referencia","href":"/docs/public/sdks/java/reference"},{"title":"Async and asynchronous jobs","href":"/docs/public/sdks/java/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/java/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/java/examples"}]},{"group":"Kotlin","pages":[{"title":"Installation","href":"/docs/public/sdks/kotlin/installation"},{"title":"Quickstart","href":"/docs/public/sdks/kotlin/quickstart"},{"title":"Referencia","href":"/docs/public/sdks/kotlin/reference"},{"title":"Coroutines and asynchronous jobs","href":"/docs/public/sdks/kotlin/streaming-and-async"},{"title":"Error handling","href":"/docs/public/sdks/kotlin/error-handling"},{"title":"Ejemplos","href":"/docs/public/sdks/kotlin/examples"}]}]},{"tab":"Resources","pages":[{"title":"Resources","href":"/docs/public/security"}]}]},{"language":"es","pages":[{"title":"es","href":"/docs/public/es/sdks/react-native/framework-guide"}]}]},"title":"Framework guide - Markpdf","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":[],"chunks":[]}