办公文档
在 Flows 应用中集成…
当需要在 Flows 应用里预览 CDF 文件(PDF、图片、文本、Office 文档)时,用 CogniteFileViewer 组件替代手动接入 react-pdf 和文件解析。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Flows 应用中集成 Cognit特定
解决思路
- 先读 package.json(判断包管理器与已有依赖)、vite.config.ts(了解现有 Vite 配置)以及要挂载查看器的组件文件,再动手修改。
- 把技能目录下 code/ 里的全部文件复制到应用的 src/cognite-file-viewer/:types.ts、mimeTypes.ts、fileResolution.ts、useViewport.ts、useFileResolver.ts、useDocumentAnnotations.ts、DocumentAnnotationOverlay.tsx、CogniteFileViewer.tsx、index.ts。PDF.js worker 已在 CogniteFileViewer.tsx 内部配置,无需额外设置。
- 安装依赖 react-pdf@^9.1.1:pnpm 用 `pnpm add react-pdf@^9.1.1`,npm 用 `npm install react-pdf@^9.1.1`,yarn 用 `yarn add react-pdf@^9.1.1`。pdfjs-dist 会作为 react-pdf 的依赖自动带上正确版本,不要单独安装。
- pnpm 用户注意:pnpm 的严格链接可能导致浏览器无法解析 pdfjs-dist,需在 .npmrc 加 `public-hoist-pattern[]=pdfjs-dist`,或直接 `pnpm add pdfjs-dist`。
- 在 vite.config.ts 中加入 `optimizeDeps: { exclude: ['pdfjs-dist'] }`,防止 Vite 预打包 pdfjs-dist 破坏 worker。
- 从本地复制的文件导入组件:`import { CogniteFileViewer } from './cognite-file-viewer';`,并通过 `const { sdk } = useDune();` 从 @cognite/dune 获取 sdk。
- 最小用法:`<CogniteFileViewer source={{ type: 'internalId', id: file.id }} client={sdk} style={{ width: '100%', height: '600px' }} />`,缩放、平移、触摸手势均内置。组件必须有明确高度,否则会塌缩为零,需通过 style、className 或父容器设置 height。
- source 支持三种类型:instanceId(`{ type: 'instanceId', space, externalId }`,可启用标注)、internalId(`{ type: 'internalId', id }`)、url(`{ type: 'url', url, mimeType }`)。有 instanceId 时优先用它,因为只有它能启用图表标注叠加层;用 sdk.files.list() 列文件时先检查 file.instanceId。
- 可用 props:page/onPageChange/onDocumentLoad 控制 PDF 分页;zoom/onZoomChange/minZoom(默认0.25)/maxZoom(默认5)/panOffset/onPanChange 控制缩放平移;fitMode='width'|'page' 控制适配模式;rotation 支持 0|90|180|270;showAnnotations(默认 true)、onAnnotationClick、onAnnotationHover、renderAnnotationTooltip 控制标注;renderOverlay 自定义叠加层;renderLoading/renderError/renderUnsupported 自定义渲染;className/style 控制布局。
- 切换文件时手动重置 page、zoom、rotation(组件不会自动重置):在 navigateToFile 中 setPage(1)、setZoom(1)、setRotation(0)。
- 分页 UI 用 numPages > 0 做条件渲染,因为 onDocumentLoad 只对 PDF 触发。
- 标注点击跳转:annotation.linkedResource 含 space 和 externalId,与 file.instanceId 匹配后调用 navigateToFile 跳转。
- renderOverlay 会收到 originalWidth/originalHeight,可用原始坐标空间设置 SVG viewBox,使 PDF 点或图片像素坐标的路径在任意缩放下正确映射。
- 触摸支持内置(双指捏合缩放、双指拖动平移);桌面端中键拖动平移,左键留给标注点击和文本选择;Ctrl/Cmd+滚轮朝光标缩放,均无需配置。
- 常见问题排查:报 `Failed to resolve module specifier 'pdf.worker.mjs'` 是 pnpm 未提升 pdfjs-dist,加 public-hoist-pattern 或直接安装;报 `API version does not match Worker version` 是 pdfjs-dist 版本不匹配,不要单独安装它;标注不显示是 instanceId 为 undefined;标注为空是文件没有 CogniteDiagramAnnotation 边;查看器高度为零是父容器没有明确高度。
适用边界 · 注意事项
- 不使用 Flows 应用或不需要预览 CDF 文件时(该技能依赖 @cognite/dune 的 useDune 和 CDF SDK)。
- 不打算使用 CogniteFileViewer 组件、想自己手动接入 react-pdf 和文件解析时。
- 没有 CDF 环境或无法获取 sdk 时,instanceId/internalId 源无法工作。