New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

kdf-pdf-tools

Package Overview
Dependencies
Maintainers
1
Versions
69
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

kdf-pdf-tools

A powerful React component library for viewing, annotating, and managing PDFs and Markdown documents with BBox support and multimedia attachments. Perfect for document annotation systems.

latest
Source
npmnpm
Version
2.5.3
Version published
Weekly downloads
16
-84.91%
Maintainers
1
Weekly downloads
 
Created
Source

KDF PDF Tools

一个强大的 React PDF 组件库,支持文档查看、BBox 标注和多媒体附件管理

npm version License: MIT

✨ 特性

  • 📄 PDF 文档查看 - 基于 react-pdf,支持高质量 PDF 渲染
  • 🎯 BBox 标注 - 支持边界框(BBox)标注和可视化
  • 📎 多媒体附件 - 支持图片、视频、音频、3D 模型等多种文件类型
  • ✏️ 可编辑模式 - 支持上传、删除、显示/隐藏多媒体文件
  • 🔌 完整 API - 通过 ref 暴露强大的 API,方便与后端集成
  • 📱 响应式设计 - 自适应不同屏幕尺寸
  • 🎨 可定制 - 支持自定义样式和行为

📦 安装

npm install kdf-pdf-tools react react-dom react-pdf pdfjs-dist

或使用 yarn:

yarn add kdf-pdf-tools react react-dom react-pdf pdfjs-dist

⚡ Worker 自动配置

无需手动配置! 从 v2.0.0 开始,PDF.js worker 会自动配置:

  • ✅ 自动使用 CDN(jsDelivr)- 开箱即用
  • ✅ 自动版本匹配 - 与 pdfjs-dist 包版本一致
  • ✅ 跨平台兼容 - 支持 Vite/Webpack/CRA/Next.js
  • ✅ 支持自定义 worker 路径(可选)

详细信息请查看 WORKER_SETUP.md

🚀 快速开始

基本用法

import { KDFReader } from 'kdf-pdf-tools'

function App() {
  return (
    <KDFReader
      pdfUrl="https://example.com/document.pdf"
      editable={true}
    />
  )
}

带 BBox 标注

import { KDFReader } from 'kdf-pdf-tools'

const bboxData = {
  blocksByPage: {
    "1": [
      {
        id: "block_1",
        bbox: [100, 100, 200, 150],
        type: "text"
      }
    ]
  }
}

function App() {
  return (
    <KDFReader
      pdfUrl="https://example.com/document.pdf"
      bboxData={bboxData}
      editable={true}
    />
  )
}

使用 Ref API

import { useRef } from 'react'
import { KDFReader } from 'kdf-pdf-tools'

function App() {
  const kdfReaderRef = useRef(null)

  const handleUpload = async () => {
    // 获取 PDF File 对象
    const pdfFile = kdfReaderRef.current.getPdfFile()
    
    // 获取多媒体 File 对象
    const multimediaFiles = kdfReaderRef.current.getMultimediaFiles()
    
    // 创建 FormData 并上传
    const formData = new FormData()
    formData.append('pdf', pdfFile)
    
    multimediaFiles.forEach((item, index) => {
      formData.append(`multimedia_${index}`, item.file)
      formData.append(`multimedia_${index}_bboxId`, item.bboxId)
    })
    
    // 发送到服务器
    await fetch('/api/upload', {
      method: 'POST',
      body: formData
    })
  }

  return (
    <div>
      <KDFReader
        ref={kdfReaderRef}
        pdfUrl={pdfFile}
        bboxData={bboxData}
        editable={true}
      />
      <button onClick={handleUpload}>上传到服务器</button>
    </div>
  )
}

📚 Props

Prop类型必填默认值描述
pdfUrlstring | File-PDF 文件 URL 或 File 对象
bboxDataObjectnullBBox 标注数据
editablebooleanfalse是否可编辑(显示上传/删除按钮)
multimediasArray[]已存在的多媒体文件
widthnumber900查看器宽度
onMultimediaChangeFunctionnull多媒体变化回调
documentOptionsObject-PDF.js 文档选项
workerSrcstringauto自定义 worker 路径(自动配置)
fileSizeLimitsObject见下表文件大小限制
styleObject{}容器自定义样式

默认文件大小限制

类型限制
图片10 MB
视频100 MB
音频20 MB
3D模型50 MB
PDF50 MB

详见 FILE_SIZE_LIMITS.md

🔌 Ref API

通过 ref 可以访问以下方法:

PDF 相关

  • getPdfFile() - 获取 PDF File 对象
  • getPdfUrl() - 获取 PDF URL
  • getPdfDocument() - 获取 pdf.js Document 对象
  • getNumPages() - 获取 PDF 页数

多媒体相关

  • getMultimedias() - 获取多媒体元数据
  • getMultimediaFiles() ⭐ - 获取多媒体 File 对象(用于上传)
  • getMultimediaByBboxId(bboxId) - 获取指定 bbox 的元数据
  • getMultimediaFileByBboxId(bboxId) ⭐ - 获取指定 bbox 的 File 对象

数据相关

  • getBboxData() - 获取 BBox 数据
  • getSnapshot() - 获取完整数据快照

详细的 API 文档请参考 REF_API.md

📖 文档

🎯 支持的文件类型

类型支持格式功能
图片jpg, png, gif, webp查看、适应/填充、显示/隐藏
视频mp4, webm, ogg播放控制、进度条
音频mp3, wav, ogg播放控制、进度条
3D 模型gltf, glb预留支持

💡 示例

上传 PDF + 多媒体文件到服务器

const handleUploadAll = async () => {
  const pdfFile = kdfReaderRef.current.getPdfFile()
  const multimediaFiles = kdfReaderRef.current.getMultimediaFiles()
  
    const formData = new FormData()
  formData.append('pdf', pdfFile)
  
  multimediaFiles.forEach((item, index) => {
    formData.append(`multimedia_${index}`, item.file)
    formData.append(`multimedia_${index}_bboxId`, item.bboxId)
    formData.append(`multimedia_${index}_metadata`, JSON.stringify(item.metadata))
  })
  
  const response = await fetch('/api/documents/upload-all', {
      method: 'POST',
      body: formData
    })
    
  const result = await response.json()
  console.log('上传成功:', result)
}

后端示例 (Node.js + Express)

const express = require('express')
const multer = require('multer')
const app = express()

const upload = multer({ dest: 'uploads/' })

app.post('/api/documents/upload-all', upload.any(), (req, res) => {
  const files = req.files
  const pdfFile = files.find(f => f.fieldname === 'pdf')
  const multimediaFiles = files.filter(f => f.fieldname.startsWith('multimedia_'))
  
  const mediaMapping = multimediaFiles.map(file => {
    const index = file.fieldname.split('_')[1]
    return {
      filename: file.filename,
      bboxId: req.body[`multimedia_${index}_bboxId`],
      metadata: JSON.parse(req.body[`multimedia_${index}_metadata`])
    }
  })
  
  res.json({
    success: true,
    pdf: pdfFile.filename,
    multimedias: mediaMapping
  })
})

更多示例请查看 EXAMPLES.md

🛠️ 开发

构建

npm run build

发布

npm publish

⚠️ 注意事项

  • Worker 自动配置:PDF.js worker 会自动配置,无需手动设置(详见 WORKER_SETUP.md
  • CORS 配置:PDF 和多媒体文件需要正确的 CORS 配置
  • File 对象getMultimediaFiles() 只返回通过上传的文件,URL 加载的文件不会返回 File 对象
  • Blob URL 清理:使用 URL.createObjectURL() 后记得清理

📄 许可证

MIT © [Your Name]

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📮 联系方式

如有问题,请提交 Issue

Keywords

pdf

FAQs

Package last updated on 19 Mar 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts