在 node.js 中解压 Drawio 文件

问题描述

我想我想解压缩一个 Drawio 绘图,将其倒入一个文件中,然后对其进行操作(例如使用 Ohm-js)。

我可以使用解压缩工具 (https://jgraph.github.io/drawio-tools/tools/convert.html) 解压缩 .drawio 文件,但是如果我在 node.js 中尝试相同的代码,我会收到错误消息。

尝试运行“node uncompress.js”时,出现“无效的存储块长度”错误

我使用的代码包含在下面。

var test = "7Vpbc5s4FP41fvQOIMDmMXZzmbbpdCab3eSpIxsBagSiqr71168wwlwk15tMwGnoiwcdXbC+7+joXBiBeby9ZjCNbqmPyMgy/O0IfBhZ1mQKxG8u2BUCz3AKQciwX4jMSnCHfyIpNKR0hX2UNQZySgnHaVO4pEmClrwhg4zRTXNYQEnzrSkMkSK4W0KiSv/FPo+k1DSMquMG4TCSr546siOG5WApyCLo001NBC5HYM4o5cVTvJ0jkmNX4nJ7YweLz/dP6/TvgATw07dPj1fjYrGr50w5bIGhhL94aRDN+c80Dm//Gd9FV/71x2/+Qk4x1pCsJF5LGqeYICb3zHclkIyuEh/li5kjMNtEmKO7FC7z3o3QHCGLeExk9xoxjgUJFwSHiZBxmg+QLxN9aNti58TWzAPeQk8RjRFnOzFPrmlbch9SR6eyuakRXrIY1bi2ynlQKll4WLoCUjxILJ+Bq6ngquB5AkGYpcVxCPA2R30WYELmlFC2nw6CILCWSyHPOKNPqNbjuwvXcTuE23GacB9OSA1vLdyvgPZjEN7w3WLm3I5/BOTxCY1Nc1zamhq6yBdWQDYp4xENaQLJZSWdVfpsiFY15jPNdXXPwXfE+U6aNLjitMkQ2mL+UHt+zJf6y5GtD1u58r6xKxuJ2O9DvVGblteraftWOa/YX76pFxApgKErtkS/0FepnhyyEPFfIO3oFYMhAjleN//cqx8qa0iHynSd3g6VFm0wKLTN/kyYFm27c7R9B019W4f21FoAt0u0bdBC2zsz2o6KNrjI1uFYYIYSGCMFfIEIb+LdhDGhcwphLkVQukBLgaBwq1TfKMa+v7+RdAQ3b6muCAJu2/ioBE37JMjVEURwlg6MGKdFjObg2H3yMtHx8j2jycB5MW31tu6VmKmogLE09CGHAyfHMtRT43ZEDvnyNMczI7kn11/u1+bX6OGGl65Uz+HJGw01vJESamhBO8JxP6GG17k79oacX12+pFd3rHS+m9YLMUbVNNSwTBfQmC7QKzXuH9tVQ6PMYNeM1/Fw7lzGy9RkH8EFTtIVPx7giHVxmh3T/ho3byestNpOmC7va2hOy2ukfbXpMdWO5XiPNwzz3yujPmlH7Ibq32pT6mZn2HafUj+jKk+sFt6gv+yfFm1LZ0IGmh1xJ+1koUpOr/GEfZY7+fcsd2i1G6jXeCcxyH7qBWNwVxuQUpzwrLby11xQqZsH2uGrU9eY0+M9o6VhxT+o9O2wlZfbh3ddHZi26smmd2ZrrKkODDM+mv6P0nNX8dHxguhgvJIea5JatLVlgb3GD+sYuF7bQPVXF9A756ra/3FJnuWS6FILx+Ogvn0St3Ujuq1vzU4ML8sjnbok+rQHXfH3nvew1cPfWdpD6yZr0h4QEwXqN5zv8Can/Yru8h3HY4/36ll47RJdjyUILdrafEeMsiz/vHhYzoVnNrnR1SBeKd0hmtX308U9UH2EDi7/Aw=="
;

function toHex (s) {
    return s.split("")
    .map(c => c.charCodeAt(0).toString(16).padStart(2,"0"))
    .join("");
}

function bytesToString(arr)
{
    var str = '';
    for (var i = 0; i < arr.length; i++) {
        str += String.fromCharCode(arr[i]);
    }
    return str;
};

// npm install atob
var atob = require ('atob');
var data = atob(test);
console.log (data.length);
console.log (toHex (data));


// npm install pako
var pako = require ('pako');
var inf = bytesToString (pako.inflateraw(data));

解决方法

我们已经将解压工具更新到 pako 2.0.3 并使用 pako.inflateRaw(Uint8Array.from(data,c => c.charCodeAt(0)),{to: 'string'}) 来解压数据.这为我们解决了问题。

,

感谢@user1084282。我的测试代码现在是:

var test = "7Vpbc5s4FP41fvQOIMDmMXZzmbbpdCab3eSpIxsBagSiQr71168wwlwk15tMwGnoiwcdXbC+7+joXBiBeby9ZjCNbqmPyMgy/O0IfBhZ1mQKxG8u2BUCz3AKQciwX4jMSnCHfyIpNKR0hX2UNQZySgnHaVO4pEmClrwhg4zRTXNYQEnzrSkMkSK4W0KiSv/FPo+k1DSMquMG4TCSr546siOG5WApyCLo001NBC5HYM4o5cVTvJ0jkmNX4nJ7YweLz/dP6/TvgATw07dPj1fjYrGr50w5bIGhhL94aRDN+c80Dm//Gd9FV/71x2/+Qk4x1pCsJF5LGqeYICb3zHclkIyuEh/li5kjMNtEmKO7FC7z3o3QHCGLeExk9xoxjgUJFwSHiZBxmg+QLxN9aNti58TWzAPeQk8RjRFnOzFPrmLbch9SR6eyuakRXrIY1bi2ynlQKll4WLoCUjxILJ+Bq6ngquB5AkGYpcVxCPA2R30WYELmlFC2nw6CILCWSyHPOKNPqNbjuwvXcTuE23GacB9OSA1vLdyvgPZjEN7w3WLm3I5/BOTxCY1Nc1zamhq6yBdWQDYp4xENaQLJZSWdVfpsiFY15jPNdXXPwXfE+U6aNLjitMkQ2mL+UHt+zJf6y5GtD1u58r6xKxuJ2O9DvVGblTeraftWOa/YX76pFxApgKErtkS/0FepnhyyEPFfIO3oFYMhAjleN//cqx8qa0iHynSd3g6VFm0wKLTN/kyYFm27c7R9B019W4f21FoAt0u0bdBC2zsz2o6KNrjI1uFYYIYSGCMFfIEIb+LdhDGhCWphLkVQukBLgaBwq1TfKMa+v7+RdAQ3b6muCAJu2/ioBE37JMjVEURwlg6MGKdFjObg2H3yMtHx8j2jycB5MW31tu6VmKmOGLE09CGHAyfHMtRT43ZEDvnyNMczI7kn11/u1+bX6OGGl65Uz+HJGw01vJESamhBO8JxP6GG17k79oacX12+pFd3rHS+m9YLMUbVNNSwTBfQmC7QKzXuH9tVQ6PMYNeM1/Fw7lzGy9RkH8EFTtIVPx7giHVxmh3T/ho3byestNpOmC7va2hOy2ukfbXpMdWO5XiPNwzz3yujPmlH7Ibq32pT6mZn2HafUj+jKk+sFt6gv+yfFm1LZ0IGmh1xJ+1koUpOr/GEfZY7+fcsd2i1G6jXeCcxyH7qBWNwVxuQUpzwrLby11xQqZsH2uGrU9eY0+M9o6VhxT+o9O2wlZfbh3ddHZi26smmd2ZrrKkODDM+mv6P0nNX8dHxguhgvJIea5JatLVlgb3GD+sYuF7bQPVXF9A756ra/3FJnuWS6FILx+Ogvn0St3Ujuq1vzU4ML8sjnbok+rQHXfH3nvew1cPfWdpD6yZr0h4QEwXqN5zv8Can/Yru8h3HY4/36ll47RJdjyUILdrafEeMsiz/vHhYzoVnNrnR1SBeKd0hmtX308U9UH2EDi7/Aw=="
;

// npm install atob
var atob = require ('atob');
var data = atob(test);
console.log (data.length);

// npm install pako
var pako = require ('pako');

var inf = pako.inflateRaw (
    Uint8Array.from (data,c=>c.charCodeAt (0)),{to: 'string'})
var str = decodeURIComponent (inf);
console.log (str);

运行它,(将代码另存为 uncompress.js)

> node uncompress.js

(这会导致屏幕上充满解码的 mxGraph)