# @cloudpdf/sdk 中文文档

规范地址：https://npmcn.com/package/%40cloudpdf/sdk/

版本：3\.1\.0
npm 元数据更新时间：2026-11-08T19:20:42.620Z
中文译文更新时间：2026-11-10T09:32:27.041Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40cloudpdf/sdk
原文对照：https://npmcn.com/package/%40cloudpdf/sdk/?lang=original
项目主页：https://github.com/embedpdf/embed-pdf-viewer#readme
源码仓库：https://github.com/embedpdf/embed-pdf-viewer

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：3.2 MB，1860 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=18\.0\.0
- 运行依赖：0 个
- 首次发布：2026-08-09T08:42:42.778Z
- 最新版本发布：2026-11-08T19:20:42.444Z
- 近 30 天下载量：1823（2026-10-10 至 2026-11-08，npm 官方下载统计）
- 已发布版本数：26（近 12 个月 26 个）

## 中文简介

官方TypeScript SDK为CloudPDF API配音.

## 安装

```sh
npm install @cloudpdf/sdk
```

也可以使用：`pnpm add @cloudpdf/sdk`、`yarn add @cloudpdf/sdk`、`bun add @cloudpdf/sdk`

## README

# CloudPDF 类型脚本 SDK

[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com/?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Cloudpdf%2FTypeScript) [![npm shield](https://img.shields.io/npm/v/@cloudpdf/sdk)](https://www.npmjs.com/package/@cloudpdf/sdk)

官方TypeScript SDK为CloudPDF API配音.

## 目录

-   [安装](https://npmcn.com/package/%40cloudpdf/sdk/#readme-installation)
-   [参考文献](https://npmcn.com/package/%40cloudpdf/sdk/#readme-reference)
-   [使用量](https://npmcn.com/package/%40cloudpdf/sdk/#readme-usage)
-   [请求和答复类型](https://npmcn.com/package/%40cloudpdf/sdk/#readme-request-and-response-types)
-   [例外处理](https://npmcn.com/package/%40cloudpdf/sdk/#readme-exception-handling)
-   [文件上传](https://npmcn.com/package/%40cloudpdf/sdk/#readme-file-uploads)
-   [从浏览器上传](https://npmcn.com/package/%40cloudpdf/sdk/#readme-uploads-from-the-browser)
-   [二进制响应](https://npmcn.com/package/%40cloudpdf/sdk/#readme-binary-response)
-   [高级](https://npmcn.com/package/%40cloudpdf/sdk/#readme-advanced)
    -   [出口](https://npmcn.com/package/%40cloudpdf/sdk/#readme-subpackage-exports)
    -   [其他信头](https://npmcn.com/package/%40cloudpdf/sdk/#readme-additional-headers)
    -   [其它查询字符串参数](https://npmcn.com/package/%40cloudpdf/sdk/#readme-additional-query-string-parameters)
    -   [检索](https://npmcn.com/package/%40cloudpdf/sdk/#readme-retries)
    -   [超时](https://npmcn.com/package/%40cloudpdf/sdk/#readme-timeouts)
    -   [中止请求](https://npmcn.com/package/%40cloudpdf/sdk/#readme-aborting-requests)
    -   [访问原始响应数据](https://npmcn.com/package/%40cloudpdf/sdk/#readme-access-raw-response-data)
    -   [日志](https://npmcn.com/package/%40cloudpdf/sdk/#readme-logging)
    -   [自定义抓取](https://npmcn.com/package/%40cloudpdf/sdk/#readme-custom-fetch)
    -   [运行时间相容性](https://npmcn.com/package/%40cloudpdf/sdk/#readme-runtime-compatibility)
-   [捐款](https://npmcn.com/package/%40cloudpdf/sdk/#readme-contributing)

## 安装

```sh
npm i -s @cloudpdf/sdk
```

## 参考文献

该图书馆的全部参考资料可供查阅 [这里](https://npmcn.com/package/%40cloudpdf/sdk/reference.md)。 。 。 .

## 使用量

以下列方式证明和使用客户端:

```typescript
import { CloudPDFClient } from "@cloudpdf/sdk";

const client = new CloudPDFClient({ token: "YOUR_TOKEN" });
await client.grants.exchange({
    grant: "grant"
});
```

客户端与CloudPDF SaaS(`https://engine.cloudpdf.com`) (中文(简体) ). 对于您自己的 CloudPDF 服务器,请通过它的地址 :

```typescript
const client = new CloudPDFClient({ baseUrl: "https://pdf.example.com", token: "YOUR_TOKEN" });
```

## 请求和答复类型

SDK导出所有请求和响应类型为TypeScript接口. 只需用 以下命名空间:

```typescript
import { CloudPDF } from "@cloudpdf/sdk";

const request: CloudPDF.HeadDocRequest = {
    ...
};
```

## 例外处理

当 API 返回一个非成功状态代码( 4xx 或 5xx 响应) 时, 以下错误的子类 将会被扔出.

```typescript
import { CloudPDFError } from "@cloudpdf/sdk";

try {
    await client.grants.exchange(...);
} catch (err) {
    if (err instanceof CloudPDFError) {
        console.log(err.statusCode);
        console.log(err.message);
        console.log(err.body);
        console.log(err.rawResponse);
    }
}
```

## 文件上传

使用高层次上传工作流程. 它计算内容散列之前, 更喜欢直接预先签名的对象存储上传,并且仅在 成功传输 :

```typescript
const result = await client.uploads.create({
    tenantId: "tenant_123",
    source: { path: "invoice.pdf" },
    uploadPreference: "auto",
    onProgress: (loaded, total) => console.log(`${loaded}/${total}`),
});
```

`source` 接受一个 `Uint8Array`, (中文(简体) ), `ArrayBuffer`, (中文(简体) ), `Blob`, (中文(简体) ), `{ path: string }`,或 一个可重开的源,已知大小和SHA-256。 一个未知的一发流是 故意拒绝: 服务器在输入时先将大小和散列标出 字节被转移 。 设定 `uploadPreference: "proxy"` 仅在服务器是时 配置以允许其被绑定的多段后退 .

`onProgress` 报告发送的字节.

## 从浏览器上传

用户的浏览器可以直接上传 PDF 到 CloudPDF, 因此文件从未通过 通过您的服务器和您的 API 密钥永远不会离开它 。 您的服务器制作 上传令牌, 上面写着文件的去处, 几分钟内就会耗尽 :

```typescript
const { token } = await client.tokens.issue({
    tenantId: "tenant_123",
    body: { kind: "upload", sub: user.id, folderId, metadata: { contractId }, expiresIn: 600 },
});
```

页面只导入上传条目, 大约为 3 KB gziped, 没有任何内容来自 节点或其他SDK:

```typescript
import { upload } from "@cloudpdf/sdk/upload";

const { document } = await upload(file, {
    token,
    onProgress: (loaded, total) => console.log(`${loaded}/${total}`),
});
```

令牌用元数据上传到它的文件夹中,最多 `maxFiles` 文档 (一个默认),没有别的. `upload()` 带 `name`, (中文(简体) ), `signal` 还有, 对于 您的 CloudPDF 服务器, `baseUrl`。 。 。 .

## 二进制响应

您可以使用 `BinaryResponse` 类型,允许您选择如何消耗数据 :

```typescript
const response = await client.doc.download(...);
const stream: ReadableStream<Uint8Array> = response.stream();
// const arrayBuffer: ArrayBuffer = await response.arrayBuffer();
// const blob: Blob = response.blob();
// const bytes: Uint8Array = response.bytes();
// You can only use the response body once, so you must choose one of the above methods.
// If you want to check if the response body has been used, you can use the following property.
const bodyUsed = response.bodyUsed;
```

对文件保存二进制响应

> 节点.js
> 
> > 可读结构(最高效)
> > 
> > ```ts
> > import { createWriteStream } from 'fs';
> > import { Readable } from 'stream';
> > import { pipeline } from 'stream/promises';
> > 
> > const response = await client.doc.download(...);
> > 
> > const stream = response.stream();
> > const nodeStream = Readable.fromWeb(stream);
> > const writeStream = createWriteStream('path/to/file');
> > 
> > await pipeline(nodeStream, writeStream);
> > ```
> 
> > 矩阵缓冲
> > 
> > ```ts
> > import { writeFile } from 'fs/promises';
> > 
> > const response = await client.doc.download(...);
> > 
> > const arrayBuffer = await response.arrayBuffer();
> > await writeFile('path/to/file', Buffer.from(arrayBuffer));
> > ```
> 
> > 块
> > 
> > ```ts
> > import { writeFile } from 'fs/promises';
> > 
> > const response = await client.doc.download(...);
> > 
> > const blob = await response.blob();
> > const arrayBuffer = await blob.arrayBuffer();
> > await writeFile('output.bin', Buffer.from(arrayBuffer));
> > ```
> 
> > 字节 (UIntArray8)
> > 
> > ```ts
> > import { writeFile } from 'fs/promises';
> > 
> > const response = await client.doc.download(...);
> > 
> > const bytes = await response.bytes();
> > await writeFile('path/to/file', bytes);
> > ```

> 阿宝
> 
> > 可读结构(最高效)
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const stream = response.stream();
> > await Bun.write('path/to/file', stream);
> > ```
> 
> > 矩阵缓冲
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const arrayBuffer = await response.arrayBuffer();
> > await Bun.write('path/to/file', arrayBuffer);
> > ```
> 
> > 块
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const blob = await response.blob();
> > await Bun.write('path/to/file', blob);
> > ```
> 
> > 字节 (UIntArray8)
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const bytes = await response.bytes();
> > await Bun.write('path/to/file', bytes);
> > ```

> 德诺
> 
> > 可读结构(最高效)
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const stream = response.stream();
> > const file = await Deno.open('path/to/file', { write: true, create: true });
> > await stream.pipeTo(file.writable);
> > ```
> 
> > 矩阵缓冲
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const arrayBuffer = await response.arrayBuffer();
> > await Deno.writeFile('path/to/file', new Uint8Array(arrayBuffer));
> > ```
> 
> > 块
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const blob = await response.blob();
> > const arrayBuffer = await blob.arrayBuffer();
> > await Deno.writeFile('path/to/file', new Uint8Array(arrayBuffer));
> > ```
> 
> > 字节 (UIntArray8)
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const bytes = await response.bytes();
> > await Deno.writeFile('path/to/file', bytes);
> > ```

> 浏览器
> 
> > Blob( 效率最高)
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const blob = await response.blob();
> > const url = URL.createObjectURL(blob);
> > 
> > // trigger download
> > const a = document.createElement('a');
> > a.href = url;
> > a.download = 'filename';
> > a.click();
> > URL.revokeObjectURL(url);
> > ```
> 
> > 可读结构
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const stream = response.stream();
> > const reader = stream.getReader();
> > const chunks = [];
> > 
> > while (true) {
> >   const { done, value } = await reader.read();
> >   if (done) break;
> >   chunks.push(value);
> > }
> > 
> > const blob = new Blob(chunks);
> > const url = URL.createObjectURL(blob);
> > 
> > // trigger download
> > const a = document.createElement('a');
> > a.href = url;
> > a.download = 'filename';
> > a.click();
> > URL.revokeObjectURL(url);
> > ```
> 
> > 矩阵缓冲
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const arrayBuffer = await response.arrayBuffer();
> > const blob = new Blob([arrayBuffer]);
> > const url = URL.createObjectURL(blob);
> > 
> > // trigger download
> > const a = document.createElement('a');
> > a.href = url;
> > a.download = 'filename';
> > a.click();
> > URL.revokeObjectURL(url);
> > ```
> 
> > 字节 (UIntArray8)
> > 
> > ```ts
> > const response = await client.doc.download(...);
> > 
> > const bytes = await response.bytes();
> > const blob = new Blob([bytes]);
> > const url = URL.createObjectURL(blob);
> > 
> > // trigger download
> > const a = document.createElement('a');
> > a.href = url;
> > a.download = 'filename';
> > a.click();
> > URL.revokeObjectURL(url);
> > ```
将二进制响应转换为文本

> 可读结构
> 
> ```ts
> const response = await client.doc.download(...);
> 
> const stream = response.stream();
> const text = await new Response(stream).text();
> ```

> 矩阵缓冲
> 
> ```ts
> const response = await client.doc.download(...);
> 
> const arrayBuffer = await response.arrayBuffer();
> const text = new TextDecoder().decode(arrayBuffer);
> ```

> 块
> 
> ```ts
> const response = await client.doc.download(...);
> 
> const blob = await response.blob();
> const text = await blob.text();
> ```

> 字节 (UIntArray8)
> 
> ```ts
> const response = await client.doc.download(...);
> 
> const bytes = await response.bytes();
> const text = new TextDecoder().decode(bytes);
> ```

## 高级

### 出口

这个SDK支持子包客户端的直接进口,它允许JavaScript捆绑器进行树摇并只包括被导入子包代码. 这导致捆绑大小要小得多.

```typescript
import { DeploymentClient } from '@cloudpdf/sdk/deployment';

const client = new DeploymentClient({...});
```

### 其他信头

如果您希望作为请求的一部分发送额外的信头,请使用 `headers` 请求选项.

```typescript
import { CloudPDFClient } from "@cloudpdf/sdk";

const client = new CloudPDFClient({
    ...
    headers: {
        'X-Custom-Header': 'custom value'
    }
});

const response = await client.grants.exchange(..., {
    headers: {
        'X-Custom-Header': 'custom value'
    }
});
```

### 其它查询字符串参数

如果您希望作为请求的一部分发送额外的查询字符串参数,请使用 `queryParams` 请求选项.

```typescript
const response = await client.grants.exchange(..., {
    queryParams: {
        'customQueryParamKey': 'custom query param value'
    }
});
```

### 检索

SDK是用有指数回放的自动回放装置. 申请要等会再审 由于请求被认为可以重试,且重试的次数没有超过所配置的 重试限制( 默认: 2) .

重审哪个状态代码取决于 `retryStatusCodes` 生成器配置 :

**`legacy`** (当前默认值):在

-   [408 (简体中文)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (超时)
-   [429个](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (太多请求)
-   [第5XX条](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#server_error_responses) (所有服务器错误,包括500个)

**`recommended`**: 重试

-   [408 (简体中文)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (超时)
-   [429个](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (太多请求)
-   [502 (中文(简体) )](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502) (坏门)
-   [第503条](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503) (服务不可用)
-   [504 (中文(简体) )](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504) (Gateway超时)

使用 `maxRetries` 请求选项来配置此行为.

```typescript
const response = await client.grants.exchange(..., {
    maxRetries: 0 // override maxRetries at the request level
});
```

### 超时

SDK默认为60第二次超时. 使用 `timeoutInSeconds` 选项来配置此行为.

```typescript
const response = await client.grants.exchange(..., {
    timeoutInSeconds: 30 // override timeout to 30s
});
```

### 中止请求

SDK允许用户在任何时刻通过一个中止信号来中止请求.

```typescript
const controller = new AbortController();
const response = await client.grants.exchange(..., {
    abortSignal: controller.signal
});
controller.abort(); // aborts the request
```

### 访问原始响应数据

SDK通过下列方式提供原始响应数据,包括信头: `.withRawResponse()` 方法. 这个 `.withRawResponse()` 方法返回给一个带有 `data` (单位:千美元) `rawResponse` 属性.

```typescript
const { data, rawResponse } = await client.grants.exchange(...).withRawResponse();

console.log(data);
console.log(rawResponse.headers['X-My-Header']);
```

### 日志

SDK支持记录. 您可以通过通过一个 `logging` 对象对客户端选项.

```typescript
import { CloudPDFClient, logging } from "@cloudpdf/sdk";

const client = new CloudPDFClient({
    ...
    logging: {
        level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info
        logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger
        silent: false, // defaults to true, set to false to enable logging
    }
});
```

这个 `logging` 对象可以具有以下属性:

-   `level`: 要使用的日志级别 。 默认为 `logging.LogLevel.Info`。 。 。 .
-   `logger`:要使用的伐木机. 默认为 a `logging.ConsoleLogger`。 。 。 .
-   `silent`: 是否让伐木工安静. 默认为 `true`。 。 。 .

这个 `level` 属性可以是下列值之一:

-   `logging.LogLevel.Debug`
-   `logging.LogLevel.Info`
-   `logging.LogLevel.Warn`
-   `logging.LogLevel.Error`

要提供自定义日志, 您可以通过一个执行 `logging.ILogger` 接口.

自定义日志示例

举个例子,用流行的 `winston` 伐木图书馆.

```ts
import winston from 'winston';

const winstonLogger = winston.createLogger({...});

const logger: logging.ILogger = {
    debug: (msg, ...args) => winstonLogger.debug(msg, ...args),
    info: (msg, ...args) => winstonLogger.info(msg, ...args),
    warn: (msg, ...args) => winstonLogger.warn(msg, ...args),
    error: (msg, ...args) => winstonLogger.error(msg, ...args),
};
```

举个例子,用流行的 `pino` 伐木图书馆.

```ts
import pino from 'pino';

const pinoLogger = pino({...});

const logger: logging.ILogger = {
  debug: (msg, ...args) => pinoLogger.debug(args, msg),
  info: (msg, ...args) => pinoLogger.info(args, msg),
  warn: (msg, ...args) => pinoLogger.warn(args, msg),
  error: (msg, ...args) => pinoLogger.error(args, msg),
};
```

### 自定义抓取

SDK提供低级 `fetch` 将自定义的 HTTP 请求生成到当前 从SDK级配置中受益,如认证、重试、超时和记录. 这对调用SDK中尚未支持的API端点很有用.

```typescript
const response = await client.fetch("/v1/custom/endpoint", {
    method: "GET",
}, {
    timeoutInSeconds: 30,
    maxRetries: 3,
    headers: {
        "X-Custom-Header": "custom-value",
    },
});

const data = await response.json();
```

### 运行时间相容性

SDK工作时间如下:

-   节点.js 18+
-   维塞尔
-   云花岗工人
-   德诺v1.25+
-   1.0+号舱
-   原生反应

## 捐款

虽然我们重视对SDK的开源贡献,但这个库是程序生成的. 直接给这个图书馆增加的代码 得转到我们一代人的代码上, 否则,它们将被覆盖 在下一次产生的释放。 随便打开公关吧 是一个概念的证明, 但知道我们将无法 合并它作为一个。 我们建议开放 先和我们讨论一个问题!

另一方面,对 " README " 的贡献总是非常受欢迎的!

## 常见问题

### @cloudpdf/sdk 是什么？

官方TypeScript SDK为CloudPDF API配音\.

### 如何安装 @cloudpdf/sdk？

在项目目录运行 npm install @cloudpdf/sdk，或使用 pnpm add / yarn add / bun add。

### @cloudpdf/sdk 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @cloudpdf/sdk 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @cloudpdf/sdk 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=18\.0\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @cloudpdf/sdk 可以商用吗？

@cloudpdf/sdk 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @cloudpdf/sdk 的下载量有多少？

根据 npm 官方下载统计，@cloudpdf/sdk 在 2026/10/10 – 2026/11/08 这 30 天内被下载 1,823 次，日均约 61 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @cloudpdf/sdk 还在维护吗？

最新版本 3\.1\.0 发布于 2026/11/09（1 天前）；至今共发布 26 个版本，其中过去 12 个月发布了 26 个；首次发布于 2026/08/09。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

