このページの目次

開発者リファレンス

すべての関数とオプション、戻ってくるもの、Webページでの表示方法をまとめました。例はそのまま動くように書いています。

どれを使えばいい?

どれも、あなたのマシンの、あなたのプロセスの中で動きます。Node.js 版は裏のスレッドで変換するので、イベントループは止まりません。Python 版は変換中に GIL を手放します。サーバーもアカウントも通信も要りません。

やりたいこと使うもの
ターミナルやスクリプト、CIでファイルを変換するdocsvg
Webアプリや 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 N1PDFを何ページ同時に変換するか。ほかの形式は1ページずつ変換します。
--max-input-mib N512 MiB受け付ける入力ファイルの大きさの上限。
--max-entry-mib N128 MiBPDFやZIP形式のファイル(Office、EPUB、3MF、CBZ)の中身を展開したとき、部品1つあたりに許す大きさ。
--max-pages N10,000書き出すページ・スライド・シートの数の上限。
--max-xml-events N5,000,0001つの部品で読むXMLの量の上限。巨大なXMLや悪意のあるXMLを止めます。
--no-metadataメタデータあり各SVGに入る出所のメタデータを省きます。
--precision N5座標に残す小数点以下の桁数。小さいほどファイルが小さくなります。
--outline-embedded-pdf-textオフPDFの埋め込みフォントの文字を図形として描きます。見た目は元どおりになりますが、文字は選択できなくなります。フォントのライセンスで許されているか確かめてください。
--embed-drawio-sourceオフdraw.io の元データを各SVGに残し、あとで編集できる図に戻せるようにします。サイズはおよそ2倍になります。
--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オフ塗りと線をすべて1色にします(例:"#1e293b")。
--responsiveオフ固定のサイズを外し、置いた場所の大きさに合わせて伸び縮みするようにします。
--precision Nなし座標を小数点以下N桁に丸めます。
--remove-metadataオフ<metadata>、<desc>、data-* 属性を取り除きます。
--clean-pathsオフパスのデータを整理します(長さ0の線分や重複した閉じを除く)。
--strip-empty-groupsオフ何も描かないグループを取り除きます。

変換で書き出されるもの

出力先は新しいフォルダか空のフォルダでなければいけません。既存のファイルを上書きすることはありません。conversion.json は変換全体の記録です。convert() や preview() の戻り値にも同じ項目が入ります(Node.js ではキャメルケースの名前になります)。

out/
├── page-0001.svg
├── page-0002.svg
└── conversion.json
項目意味
page_count書き出したページ数。
warnings文書全体で近似・省略したことの知らせ。空でも1ピクセル単位の一致は保証されません。
pages[].svgページのファイル名(convert)、またはSVGの中身そのもの(preview)。
pages[].width_points, height_pointsページの大きさ(ポイント単位、1pt = 1/72インチ)。
pages[].warningsそのページだけの知らせ。
source_format判定された形式(pptx、pdf など)。
needs_reviewpreview() のみ:文書かどのページかに警告があれば true。
elapsed_ms, input_bytes, versionかかった時間、入力の大きさ、作ったバージョン。

Node.js

エラーは Promise の reject として届きます。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?)stringSVGの文字列を整えます(同期処理)。

preview() と convert() のオプション

オプション既定値意味
jobs1PDFを何ページ同時に変換するか。ほかの形式は1ページずつ変換します。
maxInputBytes512 MiB受け付ける入力ファイルの大きさの上限。
maxZipEntryBytes128 MiBPDFやZIP形式のファイル(Office、EPUB、3MF、CBZ)の中身を展開したとき、部品1つあたりに許す大きさ。
maxPages10,000書き出すページ・スライド・シートの数の上限。
maxXmlEvents5,000,0001つの部品で読むXMLの量の上限。巨大なXMLや悪意のあるXMLを止めます。
includeMetadata: falseメタデータあり各SVGに入る出所のメタデータを省きます。
precision5座標に残す小数点以下の桁数。小さいほどファイルが小さくなります。
outlineEmbeddedPdfTextオフPDFの埋め込みフォントの文字を図形として描きます。見た目は元どおりになりますが、文字は選択できなくなります。フォントのライセンスで許されているか確かめてください。
embedDrawioSourceオフdraw.io の元データを各SVGに残し、あとで編集できる図に戻せるようにします。サイズはおよそ2倍になります。
stencilPathsなしdraw.io の図形ライブラリのファイルやフォルダ。指定しないと、ライブラリの図形はラベル付きの仮の形になります。
maxSvgBytes64 MiBpreview() のみ:1ページ分のSVGの大きさの上限。
maxTotalSvgBytes256 MiBpreview() のみ:全ページのSVGの合計の上限。

transform() のオプション

オプション既定値意味
minifyオフコメントと余分な空白を取り除きます。
monochromeオフ塗りと線をすべて1色にします(例:"#1e293b")。
responsiveオフ固定のサイズを外し、置いた場所の大きさに合わせて伸び縮みするようにします。
precisionなし座標を小数点以下N桁に丸めます。
removeMetadataオフ<metadata>、<desc>、data-* 属性を取り除きます。
cleanPathsオフパスのデータを整理します(長さ0の線分や重複した閉じを除く)。
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、import は 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)dictSVGのページを別の形式のファイルにまとめます。
transform(svg, **options)str | bytesSVGを整えます。str を渡せば str、bytes を渡せば bytes が戻ります。

preview() と convert() のオプション(キーワード引数)

オプション既定値意味
jobs1PDFを何ページ同時に変換するか。ほかの形式は1ページずつ変換します。
max_input_bytes512 MiB受け付ける入力ファイルの大きさの上限。
max_zip_entry_bytes128 MiBPDFやZIP形式のファイル(Office、EPUB、3MF、CBZ)の中身を展開したとき、部品1つあたりに許す大きさ。
max_pages10,000書き出すページ・スライド・シートの数の上限。
max_xml_events5,000,0001つの部品で読むXMLの量の上限。巨大なXMLや悪意のあるXMLを止めます。
include_metadata=Falseメタデータあり各SVGに入る出所のメタデータを省きます。
precision5座標に残す小数点以下の桁数。小さいほどファイルが小さくなります。
outline_embedded_pdf_textオフPDFの埋め込みフォントの文字を図形として描きます。見た目は元どおりになりますが、文字は選択できなくなります。フォントのライセンスで許されているか確かめてください。
embed_drawio_sourceオフdraw.io の元データを各SVGに残し、あとで編集できる図に戻せるようにします。サイズはおよそ2倍になります。
stencil_pathsなしdraw.io の図形ライブラリのファイルやフォルダ。指定しないと、ライブラリの図形はラベル付きの仮の形になります。

例外

エラー起きるとき
ValueError入力が不正か未対応、または安全上の上限に達したとき。
OSErrorファイルを読めない・書けないとき(出力フォルダが空でないときなど)。
RuntimeErrorそのほか(PDF、ZIP、XMLの構造が壊れているときなど)。

Rust

公開APIは、クレートの直下(上の関数、そのオプションとレポートの型、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 の項目

オプション既定値意味
jobs1PDFを何ページ同時に変換するか。ほかの形式は1ページずつ変換します。
max_input_bytes512 MiB受け付ける入力ファイルの大きさの上限。
max_zip_entry_bytes128 MiBPDFやZIP形式のファイル(Office、EPUB、3MF、CBZ)の中身を展開したとき、部品1つあたりに許す大きさ。
max_pages10,000書き出すページ・スライド・シートの数の上限。
max_xml_events5,000,0001つの部品で読むXMLの量の上限。巨大なXMLや悪意のあるXMLを止めます。
include_metadata: falseメタデータあり各SVGに入る出所のメタデータを省きます。
precision5座標に残す小数点以下の桁数。小さいほどファイルが小さくなります。
outline_embedded_pdf_textオフPDFの埋め込みフォントの文字を図形として描きます。見た目は元どおりになりますが、文字は選択できなくなります。フォントのライセンスで許されているか確かめてください。
embed_drawio_sourceオフdraw.io の元データを各SVGに残し、あとで編集できる図に戻せるようにします。サイズはおよそ2倍になります。
stencil_pathsなしdraw.io の図形ライブラリのファイルやフォルダ。指定しないと、ライブラリの図形はラベル付きの仮の形になります。

Error の種類

エラー起きるとき
InvalidInput入力や引数が不正なとき(出力フォルダが空でないときなど)。
Unsupported形式を判定できないとき、または対応していない機能のとき。
LimitExceeded安全上の上限に達したとき。
Io, Pdf, Xml, Zip, Jsonその層での読み込みや解析に失敗したとき。

Webページで表示する

できます。ページはふつうのSVG画像なので、どのブラウザでも表示できます。画面に出す方法は2つあります。

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 を変換して表示します(ファイル選択やドラッグ&ドロップの 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)
展開した部品1つ(PDFのストリーム、ZIPの中身)128 MiB32 MiB
ページ数10,0001,000
部品ごとのXMLの量5,000,0002,000,000
1ページ分のSVG(メモリ上のプレビュー)64 MiB16 MiB
全ページのSVG(メモリ上のプレビュー)256 MiB128 MiB
座標の小数点以下の桁数54