上下文:我正在尝试自动检查 eps 文件以检测属性列表,例如文件是否包含锁定层、嵌入的位图图像等。
到目前为止,我们已经发现其中一些东西可以通过检查原始 eps 文件数据及其随附的元数据(类似于imagemagick返回的信息)来检测。但是似乎在 illustrator 9 及更高版本创建的文件中,绝大多数此信息编码在文件的“AI9_DataStream”部分中。此数据通过ascii85编码并压缩。我们发现通过使用https://github.com/huandu/node-ascii85来解码和节点zlib
库来解压缩/解压缩,在获取这些数据方面取得了一些成功。(我们的项目是用 node / javascript 编写的)。然而,似乎在我们大约一半的测试用例/文件中,解压缩部分失败,抛出Z_DATA_ERROR
/“不正确的数据检查”。
我们负责尝试解码的方法:
export const decode = eps =>
new Promise((resolve, reject) => {
const lineDelimiters = /\r\n%|\r%|\n%/g;
const internal = eps.match(
/(%AI9_DataStream)([\s\S]*?)(AI9_PrivateDataEnd)/
);
const hasDataStream = internal && internal.length >= 2;
if (!hasDataStream) resolve('');
const encoded = internal[2].replace(lineDelimiters, '');
const decoded = ascii85.decode(encoded);
try {
zlib.unzip(decoded, (err, buffer) => {
// files can crash this process, for now we need to allow it
if (err) resolve('');
else resolve(buffer.toString('utf8'));
});
} catch (err) {
reject(err);
}
});
我想知道是否有人对这个问题有任何经验,并对可能导致此问题的原因有所了解,以及是否有另一种途径可以探索可靠地解码这些数据。关于这个主题的信息似乎有点稀少,所以任何能让我们朝着正确方向前进的东西都会非常感激。
注意:ascii85 解码产生的缓冲区都具有相同的78 9c
标头,这应该表明标准 zlib 压缩(实际上它确实在大约一半的时间内解压缩为可解析数据而没有错误)