本页目录

开发者参考

这里汇总了所有函数和选项、返回的内容,以及如何在网页中显示页面。示例都可以照原样运行。

该用哪一个?

所有方式都在你自己的机器、你自己的进程中运行。Node.js 包在后台线程中转换,事件循环不会被阻塞;Python 包在转换期间会释放 GIL。不需要服务器、账号或网络访问。

你想要…使用
在终端、脚本或 CI 中转换文件docsvg
在网页或 Electron 应用中显示上传的文档Node.js preview() + document-svg/preview-ui
在 Python 中转换:脚本、笔记本、Web APIPython 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 N1同时转换几页 PDF。其他格式逐页转换。
--max-input-mib N512 MiB接受的输入文件大小上限。
--max-entry-mib N128 MiBPDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。
--max-pages N10,000输出的页、幻灯片或工作表数量上限。
--max-xml-events N5,000,000每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。
--no-metadata包含元数据不在每个 SVG 中写入来源元数据。
--precision N5坐标保留的小数位数。数字越小,文件越小。
--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 N512 MiB输入 SVG 的总大小上限。
--max-pages N10,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() 的选项

选项默认值作用
jobs1同时转换几页 PDF。其他格式逐页转换。
maxInputBytes512 MiB接受的输入文件大小上限。
maxZipEntryBytes128 MiBPDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。
maxPages10,000输出的页、幻灯片或工作表数量上限。
maxXmlEvents5,000,000每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。
includeMetadata: false包含元数据不在每个 SVG 中写入来源元数据。
precision5坐标保留的小数位数。数字越小,文件越小。
outlineEmbeddedPdfText关闭把 PDF 嵌入字体的文字绘制成图形:外观与原件一致,但文字不能再被选中。请确认字体许可证允许这样做。
embedDrawioSource关闭在每个 SVG 中保留 draw.io 源数据,之后可以还原成可编辑的图。文件大约会变成两倍大。
stencilPaths用于绘制图形库形状的 draw.io 图形库文件或文件夹。不指定时,这类形状会显示为带标签的占位图形。
maxSvgBytes64 MiB仅 preview():单页 SVG 的大小上限。
maxTotalSvgBytes256 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() 的选项(仅限关键字参数)

选项默认值作用
jobs1同时转换几页 PDF。其他格式逐页转换。
max_input_bytes512 MiB接受的输入文件大小上限。
max_zip_entry_bytes128 MiBPDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。
max_pages10,000输出的页、幻灯片或工作表数量上限。
max_xml_events5,000,000每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。
include_metadata=False包含元数据不在每个 SVG 中写入来源元数据。
precision5坐标保留的小数位数。数字越小,文件越小。
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 字段

选项默认值作用
jobs1同时转换几页 PDF。其他格式逐页转换。
max_input_bytes512 MiB接受的输入文件大小上限。
max_zip_entry_bytes128 MiBPDF 或 ZIP 类文件(Office、EPUB、3MF、CBZ)中单个部件展开后的大小上限。
max_pages10,000输出的页、幻灯片或工作表数量上限。
max_xml_events5,000,000每个部件读取的 XML 量上限,用来拦截超大或恶意的 XML。
include_metadata: false包含元数据不在每个 SVG 中写入来源元数据。
precision5坐标保留的小数位数。数字越小,文件越小。
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 MiB64 MiB(最多 256 MiB)
单个展开部件(PDF 流、ZIP 条目)128 MiB32 MiB
页数10,0001,000
每个部件的 XML 量5,000,0002,000,000
单页 SVG(内存预览)64 MiB16 MiB
全部页面的 SVG(内存预览)256 MiB128 MiB
坐标小数位数54