{"_id":"@bingtang-rn/react-native-pdf-light","_rev":"2-01a82314c2a16cdf0442cdca2915bea4","name":"@bingtang-rn/react-native-pdf-light","dist-tags":{"latest":"3.2.2"},"versions":{"3.2.1":{"name":"@bingtang-rn/react-native-pdf-light","version":"3.2.1","keywords":["react-native","harmony","harmonyos","react-native-pdf-light"],"license":"MIT","_id":"@bingtang-rn/react-native-pdf-light@3.2.1","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_pdf_viewer","dist":{"shasum":"061adb720098362ff5986513e7fff71dde9ff550","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-pdf-light/-/react-native-pdf-light-3.2.1.tgz","fileCount":46,"integrity":"sha512-bRtgY0ouaRv//UfZDuOqogjHxHz3RXwYJ33ulVdiJKXypgG+scbHYv0/hwKDt7uUmb9xXX3ts/fO9MmDO4wn3g==","signatures":[{"sig":"MEQCICLYXmqKNT3vE7jegrTxXgOEjzigpiIW7nTaW7hSrFjUAiBHcOkL0zwgV15NSt4MfY2/UwO5UR5SBjRFBaePeG2gGQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125167},"main":"./src/index.ts","types":"./src/index.ts","module":"./src/index.ts","source":"./src/index.ts","engines":{"node":">=18"},"gitHead":"99215bcf995869948010aa2f1c8258e22e0f679a","harmony":{"alias":"react-native-pdf-light","autolinking":{"ohPackageName":"@oh-rn/react-native-pdf-light","cppPackageClassName":"PdfLightPackage","etsPackageClassName":"PdfLightPackage","cmakeLibraryTargetName":"pdf_light"},"codegenConfig":[{"version":1,"specPaths":["./src"]}]},"private":false,"scripts":{"codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/pdf_light/src/main/cpp/generated --ets-output-path ./harmony/pdf_light/src/main/ets/generated"},"_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_pdf_viewer","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_pdf_viewer组件。","directories":{},"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"tmp":"tmp/react-native-pdf-light_3.2.1_1785417710090_0.7806603503208367","host":"s3://npm-registry-packages-npm-production"}},"3.2.2":{"_id":"@bingtang-rn/react-native-pdf-light@3.2.2","dist":{"shasum":"036a6e79f8a6fccb2c8d5c5fb521e36f83787179","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-pdf-light/-/react-native-pdf-light-3.2.2.tgz","fileCount":46,"integrity":"sha512-Dn/jQMOYV/qZYM6LlohqQnfMvrVhdNIXEYBvgB/RhaBoOwVVkRxsnDqIke2kzypDrcrdbcybpqPjdCQBOHLNTQ==","signatures":[{"sig":"MEUCIC1v+Tl/721qS6wU/UXAw6x3mIjJRBxuAcGEu/i4yv17AiEA7n5GocYatP1TzN79kVU5y0RUlT5i1Wm3zc8Cpg46RYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDtS1OgAUk6fEuy7Sad0pgrM1Y5VM2kJ7FsmJeFADvGMAiAGGAhO3IuJ6xOTFqDGuelaBISTS0AVW2zCiSyX9vPifg=="}],"unpackedSize":125438},"main":"./src/index.ts","name":"@bingtang-rn/react-native-pdf-light","_from":"file:bingtang-rn-react-native-pdf-light-3.2.2.tgz","types":"./src/index.ts","module":"./src/index.ts","source":"./src/index.ts","engines":{"node":">=18"},"harmony":{"alias":"react-native-pdf-light","autolinking":{"ohPackageName":"@bingtang-rn/react-native-pdf-light","cppPackageClassName":"PdfLightPackage","etsPackageClassName":"PdfLightPackage","cmakeLibraryTargetName":"pdf_light"},"codegenConfig":[{"version":1,"specPaths":["./src"]}]},"license":"MIT","private":false,"scripts":{"codegen-lib":"react-native codegen-harmony --cpp-output-path ./harmony/pdf_light/src/main/cpp/generated --ets-output-path ./harmony/pdf_light/src/main/ets/generated"},"version":"3.2.2","_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_pdf_viewer","keywords":["react-native","harmony","harmonyos","react-native-pdf-light"],"_resolved":"D:\\code\\rn\\npm\\batch\\react_native_pdf_viewer\\bingtang-rn-react-native-pdf-light-3.2.2.tgz","_integrity":"sha512-Dn/jQMOYV/qZYM6LlohqQnfMvrVhdNIXEYBvgB/RhaBoOwVVkRxsnDqIke2kzypDrcrdbcybpqPjdCQBOHLNTQ==","repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_pdf_viewer","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_pdf_viewer组件。","directories":{},"maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"_nodeVersion":"24.15.0","react-native":"./src/index.ts","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-pdf-light_3.2.2_1790569467844_0.7529238975334656"}}},"time":{"created":"2026-07-30T13:21:49.753Z","modified":"2026-09-28T04:24:28.124Z","3.2.1":"2026-07-30T13:21:50.481Z","3.2.2":"2026-09-28T04:24:27.948Z"},"license":"MIT","homepage":"https://gitcode.com/rn_ohos_plugin/react_native_pdf_viewer","keywords":["react-native","harmony","harmonyos","react-native-pdf-light"],"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_pdf_viewer","type":"git"},"description":"适配鸿蒙版本，提供react_native_pdf_viewer组件。","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"readme":"# @bingtang-rn/react-native-pdf-light for HarmonyOS\r\n\r\n本项目基于 [react-native-pdf-light](https://github.com/alpha0010/react-native-pdf-viewer) 开发，为 React Native 鸿蒙（OpenHarmony）适配版本。如果在使用过程中有任何问题，可以在GitCode提Issue，会及时跟进。issue地址：[issues](https://gitcode.com/rn_ohos_plugin/react_native_pdf_viewer/issues)。\r\n\r\n## 版本对应关系\r\n\r\n| 鸿蒙适配包版本 | 原始库版本 | 支持 RN 版本 | Autolink | 编译 API 版本 |\r\n| ------------ | ---------- | ------------ | -------- | ------------- |\r\n| 见发布记录 | 3.2.1 | 0.72+ | 是 | API17+ |\r\n\r\n## 安装\r\n\r\n```bash\r\nnpm install @bingtang-rn/react-native-pdf-light\r\n```\r\n\r\n## 使用\r\n\r\n```tsx\r\nimport { Pdf, PdfView, PdfUtil, type PdfViewRef } from 'react-native-pdf-light';\r\n\r\n// 整文档浏览（source 须为应用沙箱绝对路径）\r\n<Pdf\r\n  source={path}\r\n  onError={(e: Error) => console.warn(e.message)}\r\n  onLoadComplete={(n: number) => console.log(`${n} pages`)}\r\n/>;\r\n\r\n// 单页渲染 + contain/fitWidth 切换\r\n<PdfView\r\n  source={path}\r\n  page={0}\r\n  resizeMode=\"contain\"\r\n  onError={(e) => console.warn(e.message)}\r\n  onLoadComplete={(e) => console.log(`${e.width}x${e.height}pt`)}\r\n/>;\r\n\r\n// 运行时更新标注（imperativeApplyAnnotation 命令）\r\nconst ref = useRef<PdfViewRef>(null);\r\nref.current?.setAnnotation(JSON.stringify([{ strokes: [...], text: [...] }]));\r\n\r\n// 元信息\r\nconst count = await PdfUtil.getPageCount(path);\r\nconst sizes = await PdfUtil.getPageSizes(path);\r\n\r\n// HarmonyOS-only：把 rawfile 资源拷到沙箱，PDF Kit 只认沙箱路径\r\nconst sandboxPath = await PdfUtil.copyAssetToFilesDir('sample.pdf');\r\n```\r\n> import 时使用原库名 `'react-native-pdf-light'`，而非鸿蒙包名（由 RNOH alias 映射为 `@bingtang-rn/react-native-pdf-light`）。\r\n\r\n**平台差异**：\r\n- HarmonyOS 上 `source` 必须为应用沙箱绝对路径（`filesDir`/`tempDir`）；`rawfile` 资源需先拷到沙箱，可用 HarmonyOS-only 的 `PdfUtil.copyAssetToFilesDir(assetName)` 完成。\r\n- `getPageSizes` / `onPdfLoadComplete` 返回的宽高单位为 PDF Points（1 英寸 = 72 点），与 iOS 一致；JS 层仅用宽高比做布局，单位差异不影响。\r\n- PDF Kit（`@kit.PDFKit`）仅在 PhonePC/2in1Tablet 设备形态、API17+ 可用；不支持时 `<PdfView>` 会通过 `onError` 上报并显示提示，`PdfUtil.*` 在调用时会 reject。\r\n\r\n**权限要求**：\r\n- 无需额外权限。PDF Kit 与应用沙箱文件读写均无 `ohos.permission.*` 要求。\r\n\r\n## Link\r\n\r\n| 版本 | 是否支持 Autolink |\r\n|------|------------------|\r\n| 当前版本 | 是 |\r\n\r\n如使用版本支持 Autolink 且工程已接入，可跳过手动配置。\r\n\r\n<details>\r\n<summary>Manual Link 配置</summary>\r\n\r\n> **说明**：本模块需要同时在 C++ 侧和 ETS 侧注册 Package。\r\n\r\n### 1. Overrides RN SDK\r\n\r\n在工程根目录 `oh-package.json5` 添加：\r\n\r\n```json\r\n{\r\n  \"overrides\": {\r\n    \"@rnoh/react-native-openharmony\": \"./react_native_openharmony\"\r\n  }\r\n}\r\n```\r\n\r\n### 2. 引入原生端依赖\r\n\r\n打开 `entry/oh-package.json5`，添加：\r\n\r\n```json\r\n\"dependencies\": {\r\n  \"@bingtang-rn/react-native-pdf-light\": \"file:../../node_modules/@bingtang-rn/react-native-pdf-light/harmony/pdf_light.har\"\r\n}\r\n```\r\n\r\n执行 `ohpm install`。\r\n\r\n### 3. 配置 CMakeLists\r\n\r\n打开 `entry/src/main/cpp/CMakeLists.txt`，添加：\r\n\r\n```cmake\r\nset(OH_MODULES \"${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules\")\r\n\r\nadd_subdirectory(\"${OH_MODULES}/@bingtang-rn/react-native-pdf-light/src/main/cpp\" ./pdf_light)\r\n\r\ntarget_link_libraries(rnoh_app PUBLIC pdf_light)\r\n```\r\n\r\n### 4. 注册 Package（C++ 侧）\r\n\r\n打开 `entry/src/main/cpp/PackageProvider.cpp`，添加：\r\n\r\n```cpp\r\n#include \"PdfLightPackage.h\"\r\n\r\nstd::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {\r\n    return {\r\n        std::make_shared<PdfLightPackage>(ctx),\r\n    };\r\n}\r\n```\r\n\r\n### 5. 注册 Package（ETS 侧）\r\n\r\n打开 `entry/src/main/ets/RNPackagesFactory.ets`，添加：\r\n\r\n```typescript\r\nimport { PdfLightPackage } from '@bingtang-rn/react-native-pdf-light/ts';\r\n\r\nexport function createRNPackages(ctx: RNPackageContext): RNPackage[] {\r\n  return [\r\n    new PdfLightPackage(ctx),\r\n  ];\r\n}\r\n```\r\n\r\n</details>\r\n\r\n## 属性 / API\r\n\r\n| API | 描述 | 参数 | 返回值 | HarmonyOS 支持 |\r\n|-----|------|------|--------|----------------|\r\n| PdfUtil.getPageCount | 获取 PDF 总页数 | source: string | Promise<number> | ✅ 完全支持 |\r\n| PdfUtil.getPageSizes | 获取每页尺寸（宽高，Points） | source: string | Promise<{width,height}[]> | ✅ 完全支持 |\r\n| PdfUtil.copyAssetToFilesDir | 拷贝 rawfile 到沙箱并返回绝对路径（HarmonyOS-only） | assetName: string | Promise<string> | ✅ 完全支持 |\r\n| <PdfView> source | PDF 沙箱路径 | string | — | ✅ 完全支持 |\r\n| <PdfView> page | 页码（0-indexed） | number | — | ✅ 完全支持 |\r\n| <PdfView> resizeMode | 缩放模式 | 'contain' \\| 'fitWidth' | — | ✅ 完全支持 |\r\n| <PdfView> annotation | PAS v1 标注文件路径 | string | — | ✅ 完全支持 |\r\n| <PdfView> annotationStr | PAS v1 标注 JSON 字符串 | string | — | ✅ 完全支持 |\r\n| <PdfView> onError | 加载/渲染失败回调 | (e: {message}) => void | — | ✅ 完全支持 |\r\n| <PdfView> onLoadComplete | 加载完成回调（页面 pt 尺寸） | (e: {width,height}) => void | — | ✅ 完全支持 |\r\n| <PdfView> setAnnotation | 运行时更新标注（imperativeApplyAnnotation 命令） | annotation: string | void | ✅ 完全支持 |\r\n| <Pdf> source | PDF 沙箱路径 | string | — | ✅ 完全支持 |\r\n| <Pdf> annotation / annotationStr | PAS v1 标注 | string | — | ✅ 完全支持 |\r\n| <Pdf> onError / onLoadComplete | 错误 / 加载完成（页数）回调 | (e?) => void | — | ✅ 完全支持 |\r\n| <Pdf> onMeasurePages | 每页显示高度与偏移回调 | (m: PageMeasurement[]) => void | — | ✅ 完全支持 |\r\n| <Pdf> shrinkToFit | 单页最大高度限制方向 | 'never'\\|'portrait'\\|'landscape'\\|'always' | — | ✅ 完全支持 |\r\n| <Pdf> ref.scrollToIndex / scrollToOffset | 滚动到页 / 偏移 | index \\| offset: number | void | ✅ 完全支持 |\r\n| <ZoomPdfView> | 可捏合缩放单页（深导入 /Zoom） | PdfViewProps + maximumZoom? 等 | — | ⚠️ 部分支持 |\r\n\r\n### 平台差异\r\n- HarmonyOS 上 `source` 必须为应用沙箱绝对路径（`filesDir`/`tempDir`）；rawfile 须先用 `PdfUtil.copyAssetToFilesDir` 拷出。\r\n- `getPageSizes` / `onPdfLoadComplete` 的宽高单位为 PDF Points（与 iOS 一致；JS 层仅用宽高比做布局）。\r\n- PDF Kit（`@kit.PDFKit`）仅在 PhonePC/2in1Tablet 设备形态、API17+ 可用；不支持时 `<PdfView>` 通过 `onError` 上报并显示提示，`PdfUtil.*` 在调用时会 reject。\r\n\r\n### 未实现 / 受限功能\r\n| API | 原因 |\r\n|-----|------|\r\n| <ZoomPdfView> pinch 缩放 | JS 源码完整保留，但 example 未演示：依赖 `react-native-gesture-handler`（已有鸿蒙适配版）未装到 example，pinch focalPoint/Scale、Animated 多节点运算、双向 ScrollView 协调、`useNativeDriver:false` 需真机验证后再定。底层 `<PdfView>` 已可用，可作为其渲染容器。 |\r\n| C++ ShadowNode 自定义 measure + State 推回 | RNOH Fabric 用 ArkUI 布局 + ETS 实现，不重写 C++ ShadowNode；由 JS 层 `getPageSizes` 驱动 `getItemLayout` + 原生 `onAreaChange` 等价实现，视觉/行为无差异。 |\r\n| 单页渲染 SLICES 切片防 OOM | 鸿蒙 `getAreaPixelMap` 一次性返回完整 PixelMap，无切片 API；bitmap 尺寸由视图尺寸驱动并按 `vp2px` 渲染到屏幕物理像素、上限 4096 防超大页 OOM。常规 A4 页 + 屏幕尺寸足够。 |\r\n\r\n### 使用限制\r\n- `PdfDocument.loadDocument` 不支持重复调用，二次加载前必须 `releaseDocument`（库内已 try/finally 保证）。\r\n- 需 HarmonyOS SDK API17+ 且设备形态为 PhonePC/2in1Tablet。\r\n\r\n## 快速验证（运行 Example）\r\n\r\n### 前置条件\r\n\r\n| 依赖 | 版本要求 |\r\n|------|----------|\r\n| Node.js | >= 18 |\r\n| DevEco Studio | 5.0+ / 6.0+ |\r\n| HarmonyOS SDK | API 17+ |\r\n\r\n### 运行步骤\r\n\r\n**1. 克隆仓库**\r\n\r\n```bash\r\ngit clone <仓库地址>\r\ncd <仓库目录>\r\n```\r\n\r\n**2. 安装依赖并构建**\r\n\r\n```bash\r\nnpm install --legacy-peer-deps\r\nnpm pack           # 生成 tgz 包（会自动触发 prepare 构建 JS 产物）\r\n```\r\n\r\n**3. 进入 example 目录，安装依赖**\r\n\r\n```bash\r\ncd example\r\nnpm install --legacy-peer-deps\r\n```\r\n\r\n**4. 生成 JS Bundle**\r\n\r\n```bash\r\nnpm run dev\r\n```\r\n\r\n产物：`harmony/entry/src/main/resources/rawfile/bundle.harmony.js`\r\n\r\n**5. 用 DevEco Studio 打开鸿蒙工程**\r\n\r\n- 打开 DevEco Studio\r\n- 选择 `example/harmony` 目录\r\n- 等待 Sync 完成\r\n\r\n**6. 编译并运行 HAP**\r\n\r\n在 DevEco Studio 中点击运行按钮，将 HAP 安装到设备/模拟器。\r\n\r\n> **注意**：Example 中已预置插件依赖和 Package 注册，无需手动配置 Link。\r\n\r\n## 约束与限制\r\n\r\n### 兼容性\r\n\r\n- RNOH: 0.72+\r\n- HarmonyOS SDK: API 17+\r\n- DevEco Studio: 5.0+\r\n\r\n## 遗留问题\r\n\r\n无（或列出已知问题）\r\n\r\n## 开源协议\r\n\r\n本项目基于 [原始库协议](原始库 LICENSE 链接)，详见 [LICENSE](./LICENSE) 文件。\r\n","readmeFilename":"README.md"}