Draw.io - 如何使用命令行将所有选项卡导出为图像

15

我已在我的电脑上安装了draw.io应用程序。我想要将所有带有绘图的选项卡导出到单独的文件中。我发现的唯一选项是:

"c:\Program Files\draw.io\draw.io.exe" --crop -x -f jpg c:\Users\user-name\Documents\_xxx_\my-file.drawio

draw.io的帮助

Usage: draw.io [options] [input file/folder]

Options:
(...)
  -x, --export                       export the input file/folder based on the
                                     given options
  -r, --recursive                    for a folder input, recursively convert
                                     all files in sub-folders also
  -o, --output <output file/folder>  specify the output file/folder. If
                                     omitted, the input file name is used for
                                     output with the specified format as
                                     extension
  -f, --format <format>              if output file name extension is
                                     specified, this option is ignored (file
                                     type is determined from output extension,
                                     possible export formats are pdf, png, jpg,
                                     svg, vsdx, and xml) (default: "pdf")
                                     (default: 0)
  -a, --all-pages                    export all pages (for PDF format only)
  -p, --page-index <pageIndex>       selects a specific page, if not specified
                                     and the format is an image, the first page
                                     is selected
  -g, --page-range <from>..<to>      selects a page range (for PDF format only)
(...)

不支持。我可以使用其中之一:

  -p, --page-index <pageIndex>       selects a specific page, if not specified
                                     and the format is an image, the first page
                                     is selected
  -g, --page-range <from>..<to>      selects a page range (for PDF format only)

但如何获取页面范围或页数以选择索引?
6个回答

15

使用Draw.io的CLI选项默认情况下没有简便方法来查找页面的数量。

一个解决方案是将图表导出为XML。

draw.io --export --format xml --uncompressed test-me.drawio

然后计算有多少个diagram元素。它应该等于页面的数量(我简单测试过,但我不确定diagram元素是否只在每个页面上出现一次)。

grep -o "<diagram" "test-me.xml" | wc -l

以下是一个将所有内容放在一起的bash脚本示例(我在MacOS 10.15上尝试过)

#!/bin/bash
file=test-me # File name excluding extension

# Export diagram to plain XML
draw.io --export --format xml --uncompressed "$file.drawio"

# Count how many pages based on <diagram element
count=$(grep -o "<diagram" "$file.xml" | wc -l)

# Export each page as an PNG
# Page index is zero based
for ((i = 0 ; i <= $count-1; i++)); do
  draw.io --export --page-index $i --output "$file-$i.png" "$file.drawio"
done


6
我喜欢应用程序支持CLI。 - Rdey

2

OP提出了关于Windows版本的问题,因此这里提供一个PowerShell解决方案,受到eddiegroves的启发。

$DIR_DRAWIO = "."

$DrawIoFiles = Get-ChildItem $DIR_DRAWIO *.drawio -File

foreach ($file in $DrawIoFiles) {
    
    "File: '$($file.FullName)'"
    
    $xml_file = "$($file.DirectoryName)/$($file.BaseName).xml"

    if ((Test-Path $xml_file)) {
        
        Remove-Item -Path $xml_file -Force
    }
    
    # export to XML
    & "C:/Program Files/draw.io/draw.io.exe" '--export' '--format' 'xml' $file.FullName

    # wait for XML file creation
    while ($true) {
        if (-not (Test-Path $xml_file)) {
            Start-Sleep -Milliseconds 200
        }
        else {
            break
        }
    }
    # load to XML Document (cast text array to object)
    $drawio_xml = [xml](Get-Content $xml_file)

    # for each page export png
    for ($i = 0; $i -lt $drawio_xml.mxfile.pages; $i++) {
        
        $file_out = "$($file.DirectoryName)/$($file.BaseName)$($i + 1).png"

        & "C:/Program Files/draw.io/draw.io.exe" '--export' '--border' '10' '--page-index' $i '--output' $file_out $file.FullName
    }

    # wait for last file PNG image file
    while ($true) {
        if (-not (Test-Path "$($file.DirectoryName)/$($file.BaseName)$($drawio_xml.mxfile.pages).png")) {
            Start-Sleep -Milliseconds 200
        }
        else {
            break
        }
    }
    # remove/delete XML file
    if ((Test-Path $xml_file)) {
        
        Remove-Item -Path $xml_file -Force
    }

    # export 'vsdx' & 'pdf'
    & "C:/Program Files/draw.io/draw.io.exe" '--export' '--format' 'vsdx' $file.FullName
    Start-Sleep -Milliseconds 1000
    & "C:/Program Files/draw.io/draw.io.exe" '--export' '--format' 'pdf' $file.FullName
}

0
值得注意的是,如果你想要从命令行运行draw.io,这里的脚本都假定你已经安装了其中一个常见版本。这些版本可以在此处获取:https://github.com/jgraph/drawio-desktop/releases 如果你通过其他软件包命令或作为一个Chrome扩展安装draw.io,由于安装位置和权限的原因,可能不太容易编写脚本。

0

基于 @eddie-groves 的脚本,这里有一个可以导出 draw.io 文件中所有图表的脚本,使用经过“清理”的图表名称。您可能可以将其转换为接受所有 diagram_file_namediagram_file_pathpng_target_path 作为参数的脚本。

在 Debian 11、draw.io 20.8 上测试通过。

#!/bin/bash
# Export all drawio diagrams into PNG files. PNG files will have "sanitized" diagram names

export diagram_file_name=your_diagram_file_name # No extension
export diagram_file_path=./diagrams
export png_target_path=./diagrams/png

# Get diagram info. No need for --uncompressed : care only about <diagram name="..." ...> part.
drawio --export --format xml --output $diagram_file_path/$diagram_file_name.xml --page-index 0 $diagram_file_path/$diagram_file_name.drawio

# grep -Eo "name=\"[^\"]*": get name="... tokens/matches from xml
# cut -c7-: get diagram name (everything but starting 'name="'')
# sed -e 's/[^a-zA-Z0-9_]/_/: replace all possible unsafe charactecter for file names with underscore (_) 
# tr '[:upper:]' '[:lower:]': make all lower case
# awk '{print NR,$1}': add sequence number (NR) to output to indicate index of diagram
# xargs -n2 sh -c: get 2 arguments (index and sanitized driagram name) and pass to shell command
# drawio --export...: export diagram at specified index (0-based) to PNG
cat $diagram_file_path/$diagram_file_name.xml \
    | grep -Eo "name=\"[^\"]*" \
    | cut -c7- \
    | sed -e 's/[^a-zA-Z0-9_]/_/g' \
    | tr '[:upper:]' '[:lower:]' \
    | awk '{print NR,$1}' \
    | xargs -n2 sh -c \
    'drawio --export --format png --output $png_target_path/$1.png --page-index $(expr $0 - 1) $diagram_file_path/$diagram_file_name.drawio'


rm $diagram_file_path/$diagram_file_name.xml

0
@Eddie Groves和@arekam的回答非常好。
我将它们作为以下脚本的起点:
alias draw="/Applications/draw.io.app/Contents/MacOS/draw.io"

# Export all pages of a diagram to PNG
# Based on: https://dev59.com/Or7pa4cB1Zd3GeqP4rgM
draw-export-all-pages-to-png () {
    if [ "$#" -eq 0 ]; then
        echo 2>&1 "No input file entered"
        return 1
    fi
    if [[ ! "$1" == *.drawio ]]; then
        echo 2>&1 "Input file is not a .drawio file"
        return 1
    fi

    input="$1"
    output_dir="$(dirname "$1")/output"

    # Get the sanitized name of each page
    # Export the diagram to XML and parse the <diagram name="PAGE_NAME" .*> elements.
    tmp_xml=$(mktemp)
    draw --export --format xml --uncompressed "$input" --output "$tmp_xml" >/dev/null
    page_names=$(cat "$tmp_xml" | grep -E '<diagram( .*)?>' | grep -Eo 'name=\"[^\"]*' | cut -c7- | \
        tr "[:upper:]" "[:lower:]" | sed -e 's/[^a-z0-9_-]/_/g')

    # Export each page
    input_base_no_ext=$(basename "$input" .drawio)
    # Using `IFS=$'\n'` to convert a multiline string into an array.
    # See: https://unix.stackexchange.com/a/92190
    (){ local IFS=$'\n'; page_array=($=page_names); }
    mkdir -p "$output_dir"
    for i in {1..${#page_array[@]}}; do
        draw --export --format png --output "$output_dir/$input_base_no_ext-${page_array[$i]}.png" \
            --page-index $(( $i - 1 )) "$input"
    done
}

注意事项:

  • 这是一个 oh-my-zsh 插件,所以代码假设使用的是 MacOS 和 ZSH - 不确定是否在没有任何修改的情况下可以在 Bash 中工作。
  • 代码将页面导出到一个名为 output 的目录中。您可能希望改进代码,并将输出目录作为函数的可选参数。

我也将代码分享为 Github Gist:https://gist.github.com/rarylson/8160ddf9a2b6cc5343fab8261a063aaa


0
使用drawio.exe,您可以将文件拖放到此命令脚本上 enter image description here 根据您的喜好进行命名、编号、格式等编辑,但请注意,drawio中的页面与PDF一样,从内部开始编号为0。在我的情况下,pages=位于第19个位置,但如果您的情况不同,您可能需要添加额外的测试。

pages2images.cmd

@echo off
setlocal enabledelayedexpansion
for /F "usebackq tokens=19* delims= " %%f in ("%~n1.drawio") do set drawio_%%f
set "trim=%drawio_pages:~1% nul
set /a "count=%trim% - 1" 2>nul
if %count% neq -2 (
  echo Pages start from 0 and end at %count%
  for /l %%p in (0,1,%count%) do echo starting page %%p&&draw.io --crop -p %%p -o "%~dpn1-page-%%p.png" -x -f png "%~1" && echo\
) else (
echo exporting page 0 && draw.io --crop -p 0 -o "%~dpn1-page-0.png" -x -f png "%~1" && echo\
)

pause

有意地显示进度和暂停,以显示此文件中的任何错误。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接