0

上下文:我正在尝试自动检查 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 压缩(实际上它确实在大约一半的时间内解压缩为可解析数据而没有错误)

4

2 回答 2

0

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

所以而不是:

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

利用:

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

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

于 2018-09-06T22:09:54.863 回答
0

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

如果您坚持使用易于理解的输入的特定工作流程,那么您可能会在简单解析方面取得一些成功,但这是唯一可行的情况。

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

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

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

于 2018-09-05T07:10:35.880 回答