首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AI9_DataStream文件中解码和解压缩.eps

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

Stack Overflow用户
提问于 2018-09-04 20:31:56
回答 2查看 450关注 0票数 0

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

到目前为止,我们发现可以通过检查原始的eps文件数据及其附带的元数据(类似于影象返回的信息)来检测其中的一些内容。然而,在插图9及以上创建的文件中,绝大多数信息都是在文件的"AI9_DataStream“部分中编码的。这些数据是通过ascii85编码和压缩的。通过使用:https://github.com/huandu/node-ascii85解码和节点zlib库解压缩/解压缩,我们在获取这些数据方面取得了一些成功。(我们的项目是用节点/javascript编写的)。然而,在我们大约一半的测试用例/文件中,解压缩部分似乎失败了,引发了Z_DATA_ERROR /“不正确的数据检查”。

我们的方法负责解码:

代码语言:javascript
复制
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压缩(实际上,它可以将解析数据解压缩到可解析的数据中,大约有一半时间没有出错)。

EN

回答 2

Stack Overflow用户

发布于 2018-09-05 07:10:35

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

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-09-06 22:09:54

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

因此,与其:

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

使用:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52173621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档