在.eps文件中解码和解压缩AI9_DataStream

问题描述 投票:0回答:2

上下文:我正在尝试自动检查eps文件以检测属性列表,例如文件是否包含锁定图层,嵌入位图图像等。

到目前为止,我们已经发现其中一些东西可以通过检查原始eps文件数据及其附带的元数据来检测(类似于imagemagick返回的信息。)然而,似乎在插图画家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压缩(实际上它确实解压缩成可解析数据大约一半的时间没有错误)

zlib eps ascii85
2个回答
0
投票

从PostScript获取内容的唯一可靠方法是通过PostScript解释器运行它,因为PostScript是一种编程语言。

如果您坚持使用具有良好理解输入的特定工作流程,那么您可能在简单解析方面取得了一些成功,但这是唯一可行的方案。

请注意,EPS文件没有“图层”,当然也没有“锁定”图层。

您实际上没有指出一个工作示例,但我怀疑AI9_DataStream的内容与EPS无关。它可能是Illustrator在EPS文件中包含其自己的本机文件格式的一种手段,而不会影响PostScript解释器。这就是它如何与AI生成的PDF文件一起使用。

这意味着当您使用Adobe Illustrator重新打开EPS文件时,它会忽略EPS并使用嵌入的本机文件,这会神奇地授予您编辑文件的功能,包括无法在EPS中表示的图层等功能。


0
投票

显然我们误读了有关ascii85编码的一些内容。在编码块的末尾有一个~>分隔符,在解码和后续解压缩之前需要从字符串中省略。

所以代替:

/(%AI9_DataStream)([\s\S]*?)(AI9_PrivateDataEnd)/

使用:

/(%AI9_DataStream)([\s\S]*?)(~>)/

您可以获得正确的编码/压缩数据。到目前为止,这已经在我们所有当前的测试用例中产生了人类可读/可复制的数据,因此除非我们抛出另一条似乎是答案的曲线。

© www.soinside.com 2019 - 2024. All rights reserved.