EPS文件格式及其与PDF、SVG格式转换分析C#

这段时间做课题,研究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文件:

  1. Inkscape创建的eps文件(开源软件,非常好的一款SVG编辑器)

    以记事本形式打开的文本较为规范,文字编码保存。

    将文字转换为路径(文字是由点集组成)

    忽略文字以latex形式保存

  2. Abode创建的eps文件

    前后乱码,但是删除乱码对于结果没有影响,但是他所创建的eps文件有起码十种(各种版本),大小从100KB~470KB不等

  3. 普通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文件内容
  1. 标头

    • EPS标识注释显示在文件的第一行:%!PS-Adobe-3.1 EPSF-3.0

    • 第二个EPS特定的注释行:边界框 % BoundingBox: 0 0 640 480

    以%%EndComments注释结尾。

    需要注意的是,虽然EPS文件中%开头的行为注释,但是,所有的注释都有它的意义,不可随意修改或删除,EPS文件需要的任何资源相应的DSC注释必须出现在文件的标题注释部分,有时还使用其他注释来指示结构和功能。

  2. PS代码

    在标头之后有PostScript代码块,它进行实际的图像的绘制、缩放、裁剪、旋转等。

  3. 位图数据

    PostScript代码块后面是位图数据,它在EPS文件中称为图形屏幕表示。EPS文件不仅包含PS代码,还包含设计多个系统工作流程中方便使用格式的预览图像(PICT ,WMF,TIFF或EPSI),而且代码定义图像的形式可以传输到PS打印机且不会丢失信息。

  4. 其他:由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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值