这段时间做课题,研究EPS转SVG的问题,特此对这一阶段的分析做一个总结。
EPS文件
eps文件
EPS,Encapsulated PostScript,是跨平台的标准格式,专用的打印机描述语言,可以描述矢量信息和位图信息。
EPS格式是一种用于打印的格式,EPS格式是专业出版与打印行业使用的文件格式,并且而且除非使用PostScript打印机,否则只能印出低分辨率的预视档或根本印不出图形。
PostScript:电脑要指挥打印机做事,就得说打印机懂得的语言,是Adobe公司所提出的一种打印语言,它是一种复杂的向量式打印机描述语言,可以保证在不同的环境中,会有相同的打印结果。
“封装”单位是一个页面,不同软件生成的各种EPS文件也有一定区别。
由此可知,EPS文件只能是0页或一页,这点在EPS解析器官方文档也有说明。
EPS 文件历史
- EPS 的第一个版本由 Adobe 于 1985 年至 1988 年之间的某个时间发布
- EPS 规范 2.0 版于 1989 年 1 月发布
- EPS 3.0 版本的规范于 1992 年作为单独的文件发布,这里要说明,虽然Abode曾经发布过这个文档,但是目前在Abode官网已经找不到了,所以只能通过其他渠道,我是在一个外网的政府网站上找到的,只能说这方面的资料中文网几乎没有。
各种EPS文件收集
针对某一简单的svg进行转换得到的各种对应的eps文件:
-
Inkscape创建的eps文件(开源软件,非常好的一款SVG编辑器)
以记事本形式打开的文本较为规范,文字编码保存。
将文字转换为路径(文字是由点集组成)
忽略文字以latex形式保存
-
Abode创建的eps文件
前后乱码,但是删除乱码对于结果没有影响,但是他所创建的eps文件有起码十种(各种版本),大小从100KB~470KB不等
-
普通svg转为的eps文件(网站上)
找到了七八个在线网站将同一SVG转为EPS文件
https://cdkm.com/cn/svg-to-eps和https://www.aconvert.com/cn/format/eps/转换成的eps格式相同,其格式和Inkscape相似(中文逗号格式问题)
另外也有几种大体类似,以上均为正规格式,大小10~14KB
alltoall(全黑色,乱七八糟)和officeConveter(转换文件一千多KB,且无法编辑)最与众不同
EPS文件格式
- EPS文件内容
-
标头
-
EPS标识注释显示在文件的第一行:
%!PS-Adobe-3.1 EPSF-3.0
-
第二个EPS特定的注释行:边界框
% BoundingBox: 0 0 640 480
以%%EndComments注释结尾。
需要注意的是,虽然EPS文件中%开头的行为注释,但是,所有的注释都有它的意义,不可随意修改或删除,EPS文件需要的任何资源相应的DSC注释必须出现在文件的标题注释部分,有时还使用其他注释来指示结构和功能。
-
-
PS代码
在标头之后有PostScript代码块,它进行实际的图像的绘制、缩放、裁剪、旋转等。
-
位图数据
PostScript代码块后面是位图数据,它在EPS文件中称为图形屏幕表示。EPS文件不仅包含PS代码,还包含设计多个系统工作流程中方便使用格式的预览图像(PICT ,WMF,TIFF或EPSI),而且代码定义图像的形式可以传输到PS打印机且不会丢失信息。
-
其他:由Abode Illustrator保存的EPS文件通常在上千KB,除了标头、大量的PostScript代码和一些位图数据以外,还包括部分乱码,此外,文档末尾还有以
%AI9_PrivateDataBegin
开头,以%AI9_PrivateDataEnd
结尾的上万行数据,每行均以%开头,个人猜测AI是通过这些私密数据进行读取,因为EPS文件通过其它方式转换成的SVG,不会特别好的将矢量转换为对应的对象,而是转换成path。
EPS解析器
Inkscape实现
使用Inkscape创建的eps文件,Inkscape却无法打开自己创建的eps文件,也无法打开AI创建的eps文件,inskape在导出到EPS时仍然会损坏数据并破坏EPS文件。
这个工具本来是一个在Linux开源的工具,直接sudo操作一通就能使用的,在Linux下可以只使用Inkscape很方便的转换文件格式,Inkscape将eps转为svg也是先用的GS将eps转为pdf,再用自己的工具将pdf转为了svg,在Windows版本的Inkscape是不支持eps文件格式的,只能将pdf转换为svg,除非安装了GS插件。
参考帖子:http://stackoverflow.com/questions/4120567/convert-pdf-to-svg
这个帖子目前已经关闭了,没有找到合适的解决方案,还是说这两种方式互转实现起来是有一定难度的
命令语句: E:\Inkscape\inkscape.exe -l E:\output\out.svg E:\output\1.pdf
Aspose实现
一个在线网站,C#中有对应引用,使用C#实现简单
eps可以转为pdf,再由pdf转为svg文件,以及eps直接转为svg,Aspose已经实现,但是调用接口未知,另外,如果文件中包含文字,报错。
结果:
1.使用AI的eps转换成的svg,svg designer打不开(微软上的一款SVG编辑器)?AI会报错,但是能打开,Inkscape没有问题
(边框、以及其中所有的元素都变成了线条)
有文字的eps转svg:报错
2.使用Inkscape创建的eps文件
Inkscape无法打开自己创建的eps文件,转换成的SVG文字缺失,Inkscape能打开,SVG Designer无法打开,AI也打不开
Inkscape无法打开ai编辑过得eps文件,显示No GhostScript executable was found错误。
(真相了,AI是通过GS去做的)
最初,找到的是Aspose直接实现文档的转换,但是转换的限制比较大,如果EPS文件中包含中文或者比较复杂的情况,就会出现错误,非常不靠谱。
现有eps解析器
Ghostscript是一套建基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等而编译成的免费软件,其他能够解析eps的软件例如Inkscape就依赖gs进行eps文件解析。
GS能够对几乎所有的EPS进行解析并转换为PDF。
Ghostscript Introduction — Ghostscript 10.01.0 documentation
将eps转为pdf命令: E:/path/gs/gs8.64/bin/gswin32c.exe -P -dNOPAUSE -dNOSAFER -dBATCH -dEPSCrop -sDEVICE=pdfwrite -sOutputFile=E:/path/1.pdf E:/path/1.eps
可以直接引用ghostscript提供的动态链接库gsdll64/32.dll进行文档格式转换。
eps转svg
这里参考的主要是这篇文章,https://blog.csdn.net/qdbszsj/article/details/70170515,作者给出了一个比较好的方案,还给了一个开源的脚本将pdf转为svg,但是依赖于node.js
https://github.com/pramodhkp/pdf2svg/
只能运行: node.exe pdf2svg.js in.pdf
我自己的方案:
由于ghostscript能够很好地解析eps,所以先使用gs将eps转为pdf,再将pdf转为svg是最好的选择。
pdf转为svg可以使用freespire组件,使用该组件,程序员可以将pdf直接转为svg,如果用spire会有水印出现,freespire是免费的,但是可能处理pdf页数有限,但是我们eps文件也就一页或零页,所以freespire完全够我们使用,此外,这个组件如果处理多页pdf,会将它转成多个svg。
E:\gswin64c.exe -P -dNOPAUSE -dNOSAFER -dBATCH -dEPSCrop -sDEVICE=pdfwrite -sOutputFile=D:\Desktop\你.pdf E:\EPS文件\文件文本格式\AI\画图.eps
可以通过将GS的动态链接库保存到项目中,然后通过调用GS动态链接库的入口和出口去解决问题,但是这样会存在一个问题,选择的路径及文件名或保存的路径及文件名包含中文会出错,为了解决这个问题,放弃通过动态链接库的入口和出口去执行,调用系统的cmd执行命令,就不会出现这种情况,因为电脑支持中文,cmd一定支持中文编码。
此外,还应注意路径中的空格问题,因为路径中的空格会导致命令执行出错,所以cmd通过路径执行命令时最好使用双引号将路径引起来。
最重要的一点,gs的协议是AGPL,这是最难的事情,这个协议不允许商用,所以这个问题其实是无解的,除非你只是想解决这个问题而并非去开发软件或商用,因为AGPL属于强协议的一种,兼容所有的GPL,只要软件中涉及它,则此软件必须开源且遵循AGPL协议。
除非你真的想自己去解析EPS,但是这其实很难,因为EPS包括PS语言,PS是基于堆栈的语言,而且当前能够解析PS语言的只有GS,虽然GS是开源的,但是它其中某文件下(一个文件夹是GS)的所有文件都是Abode System的,这些东西遵循的是AGPL协议,所以,这个还是Abode垄断的。
代码
https://download.csdn.net/download/a10750/87596876