@markpdf/react-native no depende de ningún módulo nativo propio: utiliza fetch/FormData/XMLHttpRequest global, disponible en ambos. La diferencia está en qué selector utiliza para obtener el uri/name del archivo.
En Android, verifique que su targetSdkVersion sea compatible con la versión de react-native-document-picker que instala; las versiones recientes de Android Scoped Storage cambian la forma en que se resuelven los content:// URI. Siga la guía de instalación del paquete para su versión de RN.
Ni expo-document-picker ni react-native-document-picker requieren permisos de almacenamiento explícitos en la mayoría de los casos; ambos delegan en el selector de archivos nativo del sistema (Selector de documentos en iOS, Storage Access Framework en Android), que no necesita READ_EXTERNAL_STORAGE. Si su aplicación también necesita acceder a la galería de fotos para adjuntar imágenes escaneadas, use expo-image-picker (Expo) o react-native-image-picker (desnudo) y siga sus requisitos de permiso separados, que son independientes de @markpdf/react-native.
A diferencia de una aplicación web, un binario de aplicación móvil no tiene un “servidor” que proporcione variables de entorno en tiempo de ejecución; cualquier cadena incrustada en el paquete JS puede ser eliminada por alguien con .ipa/.apk. Opciones, de más a menos seguras:
Proxy en su backend (recomendado para producción): la aplicación llama a su propio punto final, que a su vez llama a markpdf con la clave guardada en el lado del servidor. La aplicación nunca ve la clave markpdf.
Clave integrada de privilegios bajos: si no tiene su propio backend, use una clave dedicada solo a esa aplicación, con límites de uso y facturación limitados, suponiendo que pueda filtrarse.
Construir variables de entorno (EAS Secrets en Expo, .env + react-native-config en bare): evitan codificar la clave en el código fuente versionado, pero no evitan que termine en el paquete descompilable final. Útil para no enviar la clave al repositorio, no para ocultarla al usuario final.
// 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 });
Si su aplicación maneja documentos confidenciales de usuarios reales, use la opción 1 (proxy en su backend). Una clave incrustada en el binario, incluso si no está en el repositorio, aún se puede eliminar con herramientas de descompilación estándar.
Cargar archivos PDF grandes desde el selector puede llevar tiempo; Si el usuario minimiza la aplicación durante la carga, iOS/Android puede suspender la tarea de red según el sistema operativo y el estado de la aplicación. Para cargas en segundo plano largas y confiables, considere una biblioteca de carga en segundo plano (por ejemplo, react-native-background-upload) en lugar de depender de fetch/XMLHttpRequest para sobrevivir indefinidamente con la aplicación en segundo plano; esta es una limitación general de RN, no específica de @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/es/sdks/react-native/framework-guide","slug":"/docs/public/es/sdks/react-native/framework-guide","pageMetadata":{"title":"guía marco","description":"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.","href":"/docs/public/es/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: \"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.\"\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:`guía-marco`,children:`Guía marco`}),`\n`,_jsx(Heading,{level:`2`,id:`expo-vs-react-native-desnudo`,children:`Expo vs React Native desnudo`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`@markpdf/react-native`}),` no depende de ningún módulo nativo propio: utiliza `,_jsx(_components.code,{children:`fetch`}),`/`,_jsx(_components.code,{children:`FormData`}),`/`,_jsx(_components.code,{children:`XMLHttpRequest`}),` global, disponible en ambos. La diferencia está en qué selector utiliza para obtener el `,_jsx(_components.code,{children:`uri`}),`/`,_jsx(_components.code,{children:`name`}),` del archivo.`]}),`\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:[`No requiere permisos adicionales en `,_jsx(_components.code,{children:`app.json`}),`: el selector de archivos del sistema operativo maneja el acceso.`]}),`\n`,_jsxs(Heading,{level:`3`,id:`enfermero-registrado-desnudo-react-native-document-picker`,children:[`Enfermero registrado desnudo: `,_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:[`En Android, verifique que su `,_jsx(_components.code,{children:`targetSdkVersion`}),` sea compatible con la versión de `,_jsx(_components.code,{children:`react-native-document-picker`}),` que instala; las versiones recientes de Android Scoped Storage cambian la forma en que se resuelven los `,_jsx(_components.code,{children:`content://`}),` URI. Siga la guía de instalación del paquete para su versión de RN.`]}),`\n`,_jsx(Heading,{level:`2`,id:`permisos`,children:`Permisos`}),`\n`,_jsxs(_components.p,{children:[`Ni `,_jsx(_components.code,{children:`expo-document-picker`}),` ni `,_jsx(_components.code,{children:`react-native-document-picker`}),` requieren permisos de almacenamiento explícitos en la mayoría de los casos; ambos delegan en el selector de archivos nativo del sistema (Selector de documentos en iOS, Storage Access Framework en Android), que no necesita `,_jsx(_components.code,{children:`READ_EXTERNAL_STORAGE`}),`. Si su aplicación también necesita acceder a la galería de fotos para adjuntar imágenes escaneadas, use `,_jsx(_components.code,{children:`expo-image-picker`}),` (Expo) o `,_jsx(_components.code,{children:`react-native-image-picker`}),` (desnudo) y siga sus requisitos de permiso separados, que son independientes de `,_jsx(_components.code,{children:`@markpdf/react-native`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`¿dónde-vive-la-clave-api`,children:`¿Dónde vive la clave API?`}),`\n`,_jsxs(_components.p,{children:[`A diferencia de una aplicación web, un binario de aplicación móvil no tiene un “servidor” que proporcione variables de entorno en tiempo de ejecución; cualquier cadena incrustada en el paquete JS puede ser eliminada por alguien con `,_jsx(_components.code,{children:`.ipa`}),`/`,_jsx(_components.code,{children:`.apk`}),`. Opciones, de más a menos seguras:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Proxy en su backend`}),` (recomendado para producción): la aplicación llama a su propio punto final, que a su vez llama a markpdf con la clave guardada en el lado del servidor. La aplicación nunca ve la clave markpdf.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Clave integrada de privilegios bajos`}),`: si no tiene su propio backend, use una clave dedicada solo a esa aplicación, con límites de uso y facturación limitados, suponiendo que pueda filtrarse.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Construir variables de entorno`}),` (`,_jsx(_components.code,{children:`EAS Secrets`}),` en Expo, `,_jsx(_components.code,{children:`.env`}),` + `,_jsx(_components.code,{children:`react-native-config`}),` en bare): evitan codificar la clave en el código fuente versionado, pero `,_jsx(_components.strong,{children:`no`}),` evitan que termine en el paquete descompilable final. Útil para no enviar la clave al repositorio, no para ocultarla al usuario final.`]}),`\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:`Si su aplicación maneja documentos confidenciales de usuarios reales, use la opción 1 (proxy en su backend). Una clave incrustada en el binario, incluso si no está en el repositorio, aún se puede eliminar con herramientas de descompilación estándar.`})}),`\n`,_jsx(Heading,{level:`2`,id:`networking-en-segundo-plano`,children:`Networking en segundo plano`}),`\n`,_jsxs(_components.p,{children:[`Cargar archivos PDF grandes desde el selector puede llevar tiempo; Si el usuario minimiza la aplicación durante la carga, iOS/Android puede suspender la tarea de red según el sistema operativo y el estado de la aplicación. Para cargas en segundo plano largas y confiables, considere una biblioteca de carga en segundo plano (por ejemplo, `,_jsx(_components.code,{children:`react-native-background-upload`}),`) en lugar de depender de `,_jsx(_components.code,{children:`fetch`}),`/`,_jsx(_components.code,{children:`XMLHttpRequest`}),` para sobrevivir indefinidamente con la aplicación en segundo plano; esta es una limitación general de RN, no específica de `,_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":"guía marco","description":"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.","href":"/docs/public/es/sdks/react-native/framework-guide"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Guía marco","slug":"guía-marco","depth":1,"children":[]},{"title":"Expo vs React Native desnudo","slug":"expo-vs-react-native-desnudo","depth":2,"children":[{"title":"Expo: expo-document-picker","slug":"expo-expo-document-picker","depth":3,"children":[]},{"title":"Enfermero registrado desnudo: react-native-document-picker","slug":"enfermero-registrado-desnudo-react-native-document-picker","depth":3,"children":[]}]},{"title":"Permisos","slug":"permisos","depth":2,"children":[]},{"title":"¿Dónde vive la clave API?","slug":"¿dónde-vive-la-clave-api","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":"guía marco - Markpdf","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/docs/public/sdks/react-native/framework-guide","matchLevel":1},"es":{"href":"/docs/public/es/sdks/react-native/framework-guide","matchLevel":0}}},"lastModified":"2026-07-10T14:33:07.052Z","originalFileLocation":"docs/public/es/sdks/react-native/framework-guide.mdx","locale":"es"},"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=\"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.\">\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=\"guía marco - Markpdf\">\u003cmeta data-mint-head property=\"og:description\" content=\"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Markpdf\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.markpdf.tech/docs/public/es/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=gu%C3%ADa+marco\u0026amp;description=Permisos+de+almacenamiento%2Fselector%2C+diferencias+entre+Expo+y+RN+simple+y+d%C3%B3nde+guardar+la+clave+API.\u0026amp;theme=c71f31d357bbb460bcaddd6d\u0026amp;signature=168c717449d7167adc709186586ade159a3e4f2359d79b40add248cb199f9d8b\">\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=\"guía marco - Markpdf\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://markpdf.mintlify.app/_mintlify/api/og/v2?division=React+Native\u0026amp;title=gu%C3%ADa+marco\u0026amp;description=Permisos+de+almacenamiento%2Fselector%2C+diferencias+entre+Expo+y+RN+simple+y+d%C3%B3nde+guardar+la+clave+API.\u0026amp;theme=c71f31d357bbb460bcaddd6d\u0026amp;signature=168c717449d7167adc709186586ade159a3e4f2359d79b40add248cb199f9d8b\">\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/es/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/es/sdks/react-native/framework-guide.md\">\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=\"en\" href=\"https://docs.markpdf.tech/docs/public/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/es/sdks/react-native/framework-guide#webpage\",\"url\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide\",\"name\":\"guía marco\",\"description\":\"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.\",\"dateModified\":\"2026-07-10T14:33:07.052Z\",\"isPartOf\":{\"@id\":\"https://docs.markpdf.tech#website\"},\"breadcrumb\":{\"@id\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"React Native\",\"item\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/installation\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"guía marco\",\"item\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide#article\",\"headline\":\"guía marco\",\"name\":\"guía marco\",\"description\":\"Permisos de almacenamiento/selector, diferencias entre Expo y RN simple y dónde guardar la clave API.\",\"url\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide\",\"mainEntityOfPage\":{\"@id\":\"https://docs.markpdf.tech/docs/public/es/sdks/react-native/framework-guide#webpage\"},\"dateModified\":\"2026-07-10T14:33:07.052Z\",\"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,"pages":[{"title":"en","href":"/docs/public/sdks/react-native/framework-guide"}]},{"language":"es","tabs":[{"tab":"Inicio","pages":[{"title":"Inicio","href":"/docs/public/es/introduction"}]},{"tab":"API","pages":[{"title":"API","href":"/docs/public/es/api/overview"}]},{"tab":"Integraciones","pages":[{"title":"Integraciones","href":"/docs/public/es/integrations/javascript"}]},{"tab":"SDKs","groups":[{"group":"Python","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/python/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/python/quickstart"},{"title":"Referencia","href":"/docs/public/es/sdks/python/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/python/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/python/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/python/examples"}]},{"group":"Node.js / TypeScript","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/nodejs/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/nodejs/quickstart"},{"title":"Referencia","href":"/docs/public/es/sdks/nodejs/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/nodejs/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/nodejs/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/nodejs/examples"}]},{"group":"C++","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/cpp/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/cpp/quickstart"},{"title":"Referencia","href":"/docs/public/es/sdks/cpp/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/cpp/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/cpp/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/cpp/examples"}]},{"group":"Next.js","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/nextjs/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/nextjs/quickstart"},{"title":"Guía del marco: enrutador de aplicaciones","href":"/docs/public/es/sdks/nextjs/framework-guide"},{"title":"Referencia","href":"/docs/public/es/sdks/nextjs/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/nextjs/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/nextjs/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/nextjs/examples"}]},{"group":"Angular","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/angular/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/angular/quickstart"},{"title":"Guía marco: proteger la clave API","href":"/docs/public/es/sdks/angular/framework-guide"},{"title":"Referencia","href":"/docs/public/es/sdks/angular/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/angular/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/angular/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/angular/examples"}]},{"group":"React","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/react/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/react/quickstart"},{"title":"guía marco","href":"/docs/public/es/sdks/react/framework-guide"},{"title":"Referencia","href":"/docs/public/es/sdks/react/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/react/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/react/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/react/examples"}]},{"group":"React Native","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/react-native/installation"},{"title":"Inicio rápido","description":"Seleccione un PDF con expo-document-picker y conviértalo a menos de 20 líneas.","href":"/docs/public/es/sdks/react-native/quickstart"},{"title":"guía marco","href":"/docs/public/es/sdks/react-native/framework-guide"},{"title":"Referencia","description":"Clase MarkpdfClient, gancho useConvertFile y tipos @markpdf/react-native.","href":"/docs/public/es/sdks/react-native/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/react-native/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/react-native/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/react-native/examples"}]},{"group":"Svelte","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/svelte/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/svelte/quickstart"},{"title":"Guía del marco: SvelteKit","href":"/docs/public/es/sdks/svelte/framework-guide"},{"title":"Referencia","href":"/docs/public/es/sdks/svelte/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/svelte/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/svelte/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/svelte/examples"}]},{"group":"Bun","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/bun/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/bun/quickstart"},{"title":"Referencia","href":"/docs/public/es/sdks/bun/reference"},{"title":"Streaming y trabajos asincrónicos","href":"/docs/public/es/sdks/bun/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/bun/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/bun/examples"}]},{"group":"Flutter","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/flutter/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/flutter/quickstart"},{"title":"Referencia","href":"/docs/public/es/sdks/flutter/reference"},{"title":"Trabajos asincrónicos","href":"/docs/public/es/sdks/flutter/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/flutter/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/flutter/examples"}]},{"group":"Java","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/java/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/java/quickstart"},{"title":"Referencia","href":"/docs/public/es/sdks/java/reference"},{"title":"Trabajos asíncronos y asincrónicos","href":"/docs/public/es/sdks/java/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/java/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/java/examples"}]},{"group":"Kotlin","pages":[{"title":"Instalación","href":"/docs/public/es/sdks/kotlin/installation"},{"title":"Inicio rápido","href":"/docs/public/es/sdks/kotlin/quickstart"},{"title":"Referencia","href":"/docs/public/es/sdks/kotlin/reference"},{"title":"Corrutinas y trabajos asincrónicos.","href":"/docs/public/es/sdks/kotlin/streaming-and-async"},{"title":"Manejo de errores","href":"/docs/public/es/sdks/kotlin/error-handling"},{"title":"Ejemplos","href":"/docs/public/es/sdks/kotlin/examples"}]}]},{"tab":"Recursos","pages":[{"title":"Recursos","href":"/docs/public/es/security"}]}]}]},"title":"guía marco - Markpdf","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":[],"chunks":[]}