开发者参考
这里汇总了所有函数和选项、返回的内容,以及如何在网页中显示页面。示例都可以照原样运行。
该用哪一个?
所有方式都在你自己的机器、你自己的进程中运行。Node.js 包在后台线程中转换,事件循环不会被阻塞;Python 包在转换期间会释放 GIL。不需要服务器、账号或网络访问。
| 你想要… | 使用 |
|---|---|
| 在终端、脚本或 CI 中转换文件 | docsvg |
| 在网页或 Electron 应用中显示上传的文档 | Node.js preview() + document-svg/preview-ui |
| 在 Python 中转换:脚本、笔记本、Web API | Python preview() / convert() |
| 集成到 Rust 程序中 | convert_path() / convert_bytes() |
| 只在浏览器中转换(PDF、Word、Excel、PowerPoint) | <docsvg-viewer> (WebAssembly) |
命令行:docsvg
格式根据文件扩展名决定;没有扩展名或扩展名很通用时,还会查看文件开头的内容。成功时退出码为 0;失败时退出码为 1,并在标准错误中输出原因。
docsvg <INPUT> --output <FOLDER> [options]
docsvg reverse <SVG or FOLDER> --output <FILE>
docsvg transform <SVG or -> --output <SVG or -> [options]转换:docsvg <INPUT> --output <FOLDER>
| 选项 | 默认值 | 作用 |
|---|---|---|
-o, --output DIR | 必填 | 接收页面和 conversion.json 的新文件夹或空文件夹。 |
--jobs N | 1 | 同时转换几页 PDF。其他格式逐页转换。 |
--max-input-mib N | 512 MiB | 接受的输入文件大小上限。 |
--max-entry-mib N | 128 MiB | PDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。 |
--max-pages N | 10,000 | 输出的页、幻灯片或工作表数量上限。 |
--max-xml-events N | 5,000,000 | 每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。 |
--no-metadata | 包含元数据 | 不在每个 SVG 中写入来源元数据。 |
--precision N | 5 | 坐标保留的小数位数。数字越小,文件越小。 |
--outline-embedded-pdf-text | 关闭 | 把 PDF 嵌入字体的文字绘制成图形:外观与原件一致,但文字不能再被选中。请确认字体许可证允许这样做。 |
--embed-drawio-source | 关闭 | 在每个 SVG 中保留 draw.io 源数据,之后可以还原成可编辑的图。文件大约会变成两倍大。 |
--stencils PATH | 无 | 用于绘制图形库形状的 draw.io 图形库文件或文件夹。不指定时,这类形状会显示为带标签的占位图形。 |
写回:docsvg reverse
| 选项 | 默认值 | 作用 |
|---|---|---|
-o, --output FILE | 必填 | 要创建的文件。扩展名决定格式:.pptx、.docx、.xlsx、.pdf、.drawio、.dxf、.gcode、.stl、.html、.webp 等。 |
--max-input-mib N | 512 MiB | 输入 SVG 的总大小上限。 |
--max-pages N | 10,000 | 读取的 SVG 页数上限。 |
整理:docsvg transform
| 选项 | 默认值 | 作用 |
|---|---|---|
--minify | 关闭 | 去掉注释和多余空白。 |
--monochrome COLOR | 关闭 | 把所有填充和描边改成同一种颜色,例如 "#1e293b"。 |
--responsive | 关闭 | 去掉固定尺寸,让 SVG 随容器缩放。 |
--precision N | 无 | 把坐标四舍五入到 N 位小数。 |
--remove-metadata | 关闭 | 去掉 <metadata>、<desc> 和 data-* 属性。 |
--clean-paths | 关闭 | 整理路径数据(去掉零长度线段和重复的闭合)。 |
--strip-empty-groups | 关闭 | 去掉不绘制任何内容的分组。 |
转换会写出什么
输出文件夹必须是新的或空的,已有文件绝不会被覆盖。conversion.json 是整个任务的报告,convert() 和 preview() 的返回值中也有相同的字段(Node.js 中为驼峰命名)。
out/
├── page-0001.svg
├── page-0002.svg
└── conversion.json| 字段 | 作用 |
|---|---|
page_count | 写出的页数。 |
warnings | 整个文档中近似处理或省略内容的说明。为空也不保证逐像素一致。 |
pages[].svg | 页面的文件名(convert),或完整的 SVG 内容(preview)。 |
pages[].width_points, height_points | 页面尺寸,单位为点(1 pt = 1/72 英寸)。 |
pages[].warnings | 仅针对该页的说明。 |
source_format | 识别出的格式,例如 pptx 或 pdf。 |
needs_review | 仅 preview():文档或任一页有警告时为 true。 |
elapsed_ms, input_bytes, version | 耗时、输入大小,以及生成它的版本。 |
Node.js
出错时 Promise 会以 Error 拒绝,消息以问题类型开头:"invalid input"、"unsupported input"、"safety limit exceeded" 或 "I/O error"。
const { convert, preview, reverse, transform } = require('document-svg')
async function main() {
const result = await preview('slides.pptx', { maxPages: 50 })
console.log(result.pageCount, result.needsReview)
const firstPageSvg = result.pages[0].svg
const report = await convert('slides.pptx', 'out/slides', { jobs: 2 })
await reverse('out/slides', 'slides-copy.pptx')
const small = transform(firstPageSvg, { minify: true })
}
main().catch(console.error)| 函数 | 返回值 | 作用 |
|---|---|---|
preview(file, options?) | Promise<PreviewReport> | 在内存中拿到每一页的 SVG 文本,磁盘上不留任何东西。 |
convert(file, folder, options?) | Promise<ConversionReport> | 把页面和 conversion.json 写到文件夹。 |
reverse(svgOrFolder, file, options?) | Promise<ReverseReport> | 把 SVG 页面打包成其他类型的文件。选项:maxInputBytes、maxPages。 |
transform(svg, options?) | string | 整理 SVG 字符串(同步执行)。 |
preview() 和 convert() 的选项
| 选项 | 默认值 | 作用 |
|---|---|---|
jobs | 1 | 同时转换几页 PDF。其他格式逐页转换。 |
maxInputBytes | 512 MiB | 接受的输入文件大小上限。 |
maxZipEntryBytes | 128 MiB | PDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。 |
maxPages | 10,000 | 输出的页、幻灯片或工作表数量上限。 |
maxXmlEvents | 5,000,000 | 每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。 |
includeMetadata: false | 包含元数据 | 不在每个 SVG 中写入来源元数据。 |
precision | 5 | 坐标保留的小数位数。数字越小,文件越小。 |
outlineEmbeddedPdfText | 关闭 | 把 PDF 嵌入字体的文字绘制成图形:外观与原件一致,但文字不能再被选中。请确认字体许可证允许这样做。 |
embedDrawioSource | 关闭 | 在每个 SVG 中保留 draw.io 源数据,之后可以还原成可编辑的图。文件大约会变成两倍大。 |
stencilPaths | 无 | 用于绘制图形库形状的 draw.io 图形库文件或文件夹。不指定时,这类形状会显示为带标签的占位图形。 |
maxSvgBytes | 64 MiB | 仅 preview():单页 SVG 的大小上限。 |
maxTotalSvgBytes | 256 MiB | 仅 preview():所有页面 SVG 的总大小上限。 |
transform() 的选项
| 选项 | 默认值 | 作用 |
|---|---|---|
minify | 关闭 | 去掉注释和多余空白。 |
monochrome | 关闭 | 把所有填充和描边改成同一种颜色,例如 "#1e293b"。 |
responsive | 关闭 | 去掉固定尺寸,让 SVG 随容器缩放。 |
precision | 无 | 把坐标四舍五入到 N 位小数。 |
removeMetadata | 关闭 | 去掉 <metadata>、<desc> 和 data-* 属性。 |
cleanPaths | 关闭 | 整理路径数据(去掉零长度线段和重复的闭合)。 |
stripEmptyGroups | 关闭 | 去掉不绘制任何内容的分组。 |
document-svg/preview-ui(在浏览器中运行,不含原生代码)
| 函数 | 返回值 | 作用 |
|---|---|---|
createSvgPreviewUrl(svg) | string | 用于 <img> 的 Blob URL,会先检查 SVG。 |
revokeSvgPreviewUrl(url) | void | 图片不再使用时释放 Blob URL。 |
createSvgPreviewDataUrl(svg) | string | 用于传给其他窗口或进程的 data: URL。 |
copySvgToClipboard(svg) | Promise<'image/svg+xml' | 'text/plain'> | 复制图片;不能复制图片时复制源码。请在点击事件中调用。 |
copySvgSourceToClipboard(svg) | Promise<void> | 始终以文本形式复制 SVG 源码。 |
Python
安装名为 document-svg,导入名为 document_svg。返回值是普通字典,字段与 conversion.json 相同。
from document_svg import convert, preview, reverse, transform
result = preview("report.docx", max_pages=50)
print(result["page_count"], result["needs_review"])
first_page_svg = result["pages"][0]["svg"]
report = convert("report.docx", "out/report", jobs=2)
reverse("out/report", "report-copy.docx")
small = transform(first_page_svg, minify=True)| 函数 | 返回值 | 作用 |
|---|---|---|
preview(path, **options) | dict | 在内存中拿到每一页的 SVG 文本,还可以指定 max_svg_bytes 和 max_total_svg_bytes。 |
convert(path, folder, **options) | dict | 把页面和 conversion.json 写到文件夹。 |
reverse(svg_or_folder, path, *, max_input_bytes=None, max_pages=None) | dict | 把 SVG 页面打包成其他类型的文件。 |
transform(svg, **options) | str | bytes | 整理 SVG。传入 str 返回 str,传入 bytes 返回 bytes。 |
preview() 和 convert() 的选项(仅限关键字参数)
| 选项 | 默认值 | 作用 |
|---|---|---|
jobs | 1 | 同时转换几页 PDF。其他格式逐页转换。 |
max_input_bytes | 512 MiB | 接受的输入文件大小上限。 |
max_zip_entry_bytes | 128 MiB | PDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。 |
max_pages | 10,000 | 输出的页、幻灯片或工作表数量上限。 |
max_xml_events | 5,000,000 | 每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。 |
include_metadata=False | 包含元数据 | 不在每个 SVG 中写入来源元数据。 |
precision | 5 | 坐标保留的小数位数。数字越小,文件越小。 |
outline_embedded_pdf_text | 关闭 | 把 PDF 嵌入字体的文字绘制成图形:外观与原件一致,但文字不能再被选中。请确认字体许可证允许这样做。 |
embed_drawio_source | 关闭 | 在每个 SVG 中保留 draw.io 源数据,之后可以还原成可编辑的图。文件大约会变成两倍大。 |
stencil_paths | 无 | 用于绘制图形库形状的 draw.io 图形库文件或文件夹。不指定时,这类形状会显示为带标签的占位图形。 |
异常
| 错误 | 何时出现 |
|---|---|
ValueError | 输入无效或不受支持,或达到了安全上限。 |
OSError | 无法读写文件,例如输出文件夹不为空。 |
RuntimeError | 其他情况,例如 PDF、ZIP 或 XML 结构损坏。 |
Rust
公开 API 只有 crate 根下的内容(上述函数及其选项、报告类型和 Error)以及 ir、svg 模块;内部读取模块在不同版本之间可能变化。
use document_svg::{convert_path, ConvertOptions};
fn main() -> Result<(), document_svg::Error> {
let options = ConvertOptions { jobs: 2, ..ConvertOptions::default() };
let report = convert_path("report.pdf", "out/report", &options)?;
println!("{} pages, {} warnings", report.page_count, report.warnings.len());
Ok(())
}| 函数 | 返回值 | 作用 |
|---|---|---|
convert_path(input, folder, &ConvertOptions) | Result<ConversionReport> | 转换文件并写出页面和 conversion.json。 |
convert_bytes(name, &bytes, &ConvertOptions, ByteConvertLimits, on_page) | Result<ByteConversionReport> | 不用临时文件,直接在内存中转换;每完成一页就把 SvgPage 交给 on_page。也可用于 wasm32。 |
svg_to_document(input, output, &ReverseOptions) | Result<ReverseReport> | 把 SVG 页面打包成其他类型的文件(即命令行的 reverse)。 |
transform_svg(&bytes, &TransformOptions) | Result<Vec<u8>> | 整理 SVG(即命令行的 transform)。 |
ConvertOptions 字段
| 选项 | 默认值 | 作用 |
|---|---|---|
jobs | 1 | 同时转换几页 PDF。其他格式逐页转换。 |
max_input_bytes | 512 MiB | 接受的输入文件大小上限。 |
max_zip_entry_bytes | 128 MiB | PDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。 |
max_pages | 10,000 | 输出的页、幻灯片或工作表数量上限。 |
max_xml_events | 5,000,000 | 每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。 |
include_metadata: false | 包含元数据 | 不在每个 SVG 中写入来源元数据。 |
precision | 5 | 坐标保留的小数位数。数字越小,文件越小。 |
outline_embedded_pdf_text | 关闭 | 把 PDF 嵌入字体的文字绘制成图形:外观与原件一致,但文字不能再被选中。请确认字体许可证允许这样做。 |
embed_drawio_source | 关闭 | 在每个 SVG 中保留 draw.io 源数据,之后可以还原成可编辑的图。文件大约会变成两倍大。 |
stencil_paths | 无 | 用于绘制图形库形状的 draw.io 图形库文件或文件夹。不指定时,这类形状会显示为带标签的占位图形。 |
Error 变体
| 错误 | 何时出现 |
|---|---|
InvalidInput | 输入或参数无效,例如输出文件夹不为空。 |
Unsupported | 无法识别格式,或功能不受支持。 |
LimitExceeded | 达到了安全上限。 |
Io, Pdf, Xml, Zip, Json | 在该层读取或解析失败。 |
在网页中显示页面
可以。页面是普通的 SVG 图片,任何浏览器都能显示。把它们显示到界面上有两种方式。
1. 在服务器或 Electron 主进程中用 Node.js 转换,把 SVG 发送到页面,再用 preview-ui 显示(见 Node.js 一节和预览指南)。适用于所有支持的格式。
2. 用 WebAssembly 版在浏览器中转换,并用现成的 <docsvg-viewer> 元素显示。不上传,也不需要服务器。支持 PDF、Word、Excel 和 PowerPoint,提供缩略图、缩放、适应宽度或页面、旋转、全屏、文字搜索以及下载当前页面。
<script type="module" src="/bindings/wasm/web/docsvg-viewer.js"></script>
<docsvg-viewer thumbnails></docsvg-viewer>
<script type="module">
const viewer = document.querySelector('docsvg-viewer')
viewer.options = { maxPages: 200 } // optional limits
fileInput.addEventListener('change', () => viewer.openFile(fileInput.files[0]))
</script><docsvg-viewer> 速查
| 函数 | 作用 |
|---|---|
thumbnails | 属性:显示页面缩略图栏。 |
openFile(file) | 方法:转换并显示一个 File(来自文件选择或拖放;元素本身也支持这两种操作)。 |
options | 属性:maxInputBytes(默认 64 MiB)、maxPages(默认 1,000)、precision 等上限。 |
键盘 | 方向键和 Page Up/Down 翻页,+ 和 − 缩放,f 适应宽度,r 旋转。 |
- WebAssembly 版没有作为软件包发布。请从 bindings/wasm 构建(需要 Rust 和 wasm-bindgen),再从你的网站提供 bindings/wasm/web。
- 请通过 HTTP 提供;用 file:// 打开无法运行。使用 Content-Security-Policy 时,script 需要 'wasm-unsafe-eval',worker 需要 'self'。
- 页面通过 <img> 中的 Blob URL 显示,查看器不会把文档 SVG 插入你的页面。
上限一览
所有上限都是为了保护机器免受超大或损坏文件的影响。可以按用途调低;不要只是为了让难处理的文件通过而调高。
| 上限 | 命令行、Node.js、Python、Rust | 浏览器(WebAssembly) |
|---|---|---|
| 输入文件 | 512 MiB | 64 MiB(最多 256 MiB) |
| 单个展开部件(PDF 流、ZIP 条目) | 128 MiB | 32 MiB |
| 页数 | 10,000 | 1,000 |
| 每个部件的 XML 量 | 5,000,000 | 2,000,000 |
| 单页 SVG(内存预览) | 64 MiB | 16 MiB |
| 全部页面的 SVG(内存预览) | 256 MiB | 128 MiB |
| 坐标小数位数 | 5 | 4 |